ValueError: Python 中 float() 的无效字面量

5 投票
3 回答
34674 浏览
提问于 2025-04-17 05:31

大家好:

我想知道有没有人能帮我理解这个错误: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')]

撰写回答