Python中的ValueError:float()无效的文字表示。

5

给大家:

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

I get:

<type 'str'>

我不明白为什么map(float, lines)函数不能正确地工作。我使用该函数的方法是否不正确?从文档上看,map函数的定义为:map(function, iterable, ...)。难道列表不是可迭代的吗?
此外,如果有人能够解释这个错误/指引我去找一个解释这个错误的方向,我会非常感激。
提前感谢对这个问题的帮助。

1
你是说0.000\t0.000...\t0.000\n都在一行上吗?如果是这样,那么我会认为这就是传递给float()的内容,但它无法进行转换。看起来你需要将它们分割成单独的浮点数值。是这样吗? - eldarerathis
@eldarerathis 是的,这是一行代码,但在处理时它似乎通过了一定数量的值,然后出现错误:b = map(float, lines) ValueError: invalid literal for float(): 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0. 它实际上没有通过所有的值吗? - geop
看起来就像你上面提到的那个字符串,但是\t被显示为空格(即实际的制表符)。我猜这是一个字符串字面量,而不是一堆较短的字符串。 - eldarerathis
@eldarerathis 那样做是有道理的。它只是把它看作一个字符串。感谢您的帮助。 - geop
3个回答

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')]

2

a.readlines() 是一个字符串列表,因此你在 map 中尝试将 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]]

非常感谢您的帮助。这让我之前做错的地方变得非常清晰。我真的很感激您的评论! - geop

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]]

谢谢您的帮助,这让我理解了我的错误。但我不明白的是,在发现错误之前,为什么似乎已经处理了一些日期?这是我的误解吗? - geop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接