ValueError: неверный литерал для float () в Python - PullRequest
5 голосов
/ 02 ноября 2011

Для всех:

Мне интересно, если кто-нибудь может помочь мне понять ошибку: ValueError: недопустимый литерал для float ().Я получаю это, когда я передаю текстовый файл в список, а затем пытаюсь преобразовать этот список в плавающие значения.

a = open("input.txt","r")
lines = a.readlines()
b = map(float, lines)

Что странно, по крайней мере для меня, это то, что когда я обрабатываю:

print repr(lines[0])

Я получаю:

'0,000 \ t0,000 ... \ t0,000 \ t0,000 \ n'

и

print type(lines[0])

Я получаю:

<type 'str'>

Поэтому я не понимаю, почему карта (с плавающей точкой, линии) не работает правильно.Я использую эту функцию неправильно?Смотря на документацию, функция карты дается как: карта (функция, итеративная, ...).Разве список не повторяется?

Также, если бы кто-то мог объяснить эту ошибку / указать мне направление объяснения этой ошибки, я был бы очень признателен.

Заранее спасибо за помощь по этому вопросу.

Ответы [ 3 ]

7 голосов
/ 03 ноября 2011

В этом случае вам не нужны readlines - это пустая трата времени и памяти.

Если вам нужен список списков с плавающей точкой:

b = [[float(v) for v in line.rstrip('\n').split('\t')] for line in a]

или только одинбольшой список поплавков:

b = [float(v) for line in a for v in line.rstrip('\n').split('\t')]
2 голосов
/ 02 ноября 2011

ValueError происходит от символа \t в строке. Вы должны разбить каждую строку на отдельные столбцы, прежде чем конвертировать каждый в отдельности.

>>> lines = ['0.000\t1.000\t2.000\n', '3.000\t4\t5.0\n']
>>> [[float(val) for val in line.strip().split('\t')] for line in lines]
[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0]]
2 голосов
/ 02 ноября 2011

a.readlines() - это список строк, поэтому вы пытаетесь преобразовать float('0.000\t0.000\t0.000\t0.000\n') в карту, что объясняет ошибку, которую вы видите.

Вам нужно сделать немного больше обработки (см. Встроенные комментарии):

>>> x = '0.000\t0.000\t0.000\t0.000\n'
# To simulate a.readlines()' list
>>> lines = [x,]
>>> 

# Strip the newline, and separate the values based on the tab control character.
>>> lines_values = map(lambda l: l.strip().split('\t'), lines)
>>> lines_values
[['0.000', '0.000', '0.000', '0.000']]

# For each value in in the list of lines' values, convert from string to a float.
>>> values_float = [map(float, v) for v in values]
>>> values_float
[[0.0, 0.0, 0.0, 0.0]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...