Общие выражения в файле ввода / вывода l oop со строками и числами с плавающей запятой - PullRequest
0 голосов
/ 27 апреля 2020

Я надеюсь, что какое-то тело поможет мне понять, как работает этот код - я читаю в текстовом файле с разделителями табуляции, в котором есть заголовок с заголовком переменной, затем столбец 0 = id и последующие столбцы = to значение N / A или значение с плавающей запятой.

#!/usr/bin/env python3

import sys

argvstuff = sys.argv


filename = argvstuff[1]
outputname = argvstuff[2]

df_handle = open(filename, "r")
wf_handle = open(outputname, "w")

rawheaderLine = df_handle.readline()
wf_handle.write(rawheaderLine)

for rawline in df_handle:
        line = rawline.strip()
        lineparts = line.split("\t")
        id = lineparts[0]
        yes_or_no = lineparts[1]
        heart1 = (lineparts[2])
        liver1 = (lineparts[3])
        lung1 = (lineparts[4])
        brain1 = (lineparts[5])


if(yes_or_no == "Y" and str(lineparts[2:]) != "NA"):
                if((kidney1) and (kidney2) and (kidney3) <= -1.5):
                        if((liver1) and (liver2) and (liver3) > 1.5):


                                wf_handle.write(f"{id} \t {yes_or_no} \t {heart1} \t {liver1} \t {lung1} \t {brain1} \t {kidney1} \n")

Если у меня есть только первый оператор if, он будет правильно печатать все индексы списка строк, со всей строкой, такой, что yes_or_no = Y, и никакие индексы не будут иметь «NA» в качестве ценность. Я предполагаю, что теперь, когда я отсортировал его на основании того, что все последующие строки чтения не будут иметь значения «NA», а вместо этого будут иметь значения с плавающей запятой, а yes_or_no будет равно Y, и я могу начать выполнять мои следующие заявления на это. Тем не менее, я получаю ошибку типа. Я пытался преобразовать их в float (), но я получаю ту же ошибку, по какой-то причине кажется, что значения 'NA' все еще проходят через мои, если l oop - Где я здесь ошибаюсь? Спасибо

TypeError: '<=' not supported between instances of 'str' and 'float'

Вот пример входного файла

    id     yes_or_no    heart1    kidney1    liver1    brain1   
thing1    Y    0.00061    0.5567    NA    2.51
thing2    N    0.00511    1.5    2.4    0.0004
thing3    N    NA    0.05    2.025    1.511

1 Ответ

0 голосов
/ 27 апреля 2020

Вместо:

if((kidney1) and (kidney2) and (kidney3) <= -1.5):

Вы, вероятно, намереваетесь проверить, меньше ли каждое отдельное значение -1,5:

if (kidney1 <= -1.5) and (kidney2 <= -1.5) and (kidney3 <= 1.5):

Это не будет выполнено, если значения почек являются строками, что скорее всего, если вы читаете их из файла. Вы можете избежать ошибки, приведя их к числам с плавающей точкой:

if float(kidney1) <= -1.5 and float(kidney2) <= -1.5 and float(kidney3) <= 1.5:

Даже если вы приведете значения почек к значениям с плавающей точкой, в исходной версии у вас возникнут проблемы, поскольку операция <= не распространяется в течение трех значений почек. Ваш исходный оператор такой же, как:

if (kidney1 and kidney2 and kidney3) <= -1.5

Когда вы используете and для последовательности значений, Python будет повторять их до тех пор, пока не достигнет конца последовательности или не увидит "ложь" " ценность. Для строк пустая строка - false, а любая непустая строка - правдивая. Для чисел с плавающей точкой 0 - ложь, а все остальное (даже NaN) - правда. В консоли стоит поиграть с этим, чтобы создать интуицию:

>>> "hello" and "world"
"world"
>>> "hello" and "world" and "" and "more" and "strings"
""
>>> (1 and 3) <= 1.5
False
>>> (3 and 1) <= 1.5
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...