Неверный литерал для float (): 0,000001, как исправить ошибку? - PullRequest
3 голосов
/ 29 марта 2012

У меня есть файл .csv, содержащий 3 столбца данных.Мне нужно создать новый выходной файл, который включает в себя определенный набор данных из первого и третьего столбца из исходного файла.Третий столбец содержит десятичные значения, и я считаю, что в таком случае я использовал функцию float () Python.Я пробовал следующий код:

in_file = open("filename.csv", "r")

out_file = open("output.csv", "w")

while True:

    line = in_file.readline()
    if (line == ''): 
        break
    line = line.strip() 
    items = line.split(',') 
    gi_name = items[0] 
    if (gi_name.startswith("_"))
        continue
    p_value = float(items[2]) 
    if (p_value > 0.05):
        continue
    out_file.write(','.join([gene_name, str(p_value)]))
in_file.close()
out_file.close()

, когда я запускаю выше, я получаю следующую ошибку:

Ошибка: неверный литерал для float (): 0,000001

значение 0,0000001 - это первое значение в моем наборе данных для третьего столбца, и я думаю, что код не может считываться за пределами этого набора, но я не уверен, почему.Я новичок в Python, и не очень понимаю, почему я получаю эту ошибку или как ее исправить.Я пробовал другие модификации для того, чтобы ввести float (), но безуспешно.Кто-нибудь знает, как я мог бы это исправить?

Ответы [ 2 ]

5 голосов
/ 29 марта 2012

Из того, что вы написали, неясно, есть ли что-то не так с строкой, которую вы пытаетесь передать float() (потому что выглядит совершенно разумно).Попробуйте добавить оператор отладочной печати:

print(repr(items[2]))
p_value = float(items[2])

Тогда вы сможете точно определить , что передается float().Вызов repr() сделает видимыми даже обычно невидимые символы.Добавьте результат к своему вопросу, и мы сможем прокомментировать дальше.

1 голос
/ 29 марта 2012

Ваш файл, скорее всего, имеет какой-то непечатаемый символ, который читается.Попробуйте это:

>>> a = '0.00001\x00'
>>> a
'0.00001\x00'
>>> print(a)
0.00001
>>> float(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 0.00001

Вы можете видеть, что a имеет символ NUL, который не печатается ни с print, ни с исключением float.

...