ValueError: Python 中 float() 的无效字面量
大家好:
我想知道有没有人能帮我理解这个错误:ValueError: invalid literal for 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'>
所以我不明白为什么 map(float, lines) 不工作。难道我用错这个函数了吗?根据文档,map 函数的用法是:map(function, iterable, ...)。难道列表不是可迭代的吗?
如果有人能解释这个错误或者指引我找到解释的方向,我会非常感激。
提前感谢大家对这个问题的帮助。
3 个回答
2
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]]
2
这个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]]
7
在这种情况下,你不需要使用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')]