2011-11-02 37 views
5

致全部:ValueError:Python中float()的无效字面积

我很好奇,如果有人能帮我理解错误: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'> 

我不明白为什么map(float,lines)不能正常工作。我是否错误地使用了这个功能?看看这个文档,map函数被给出为:map(function,iterable,...)。列表不可迭代吗?

此外,如果有人能解释这个错误/指向我解释这个错误的方向,我将不胜感激。

在此先感谢您对此问题的帮助。

+1

你是说'0.000 \ T0.000 ... \ T0 .000 \ n'都是一行吗?如果是这样,那么我会假设这是传递给'float()'的东西,它不能转换。好像你需要把它分成单独的浮点值。是这样吗? – eldarerathis

+0

@eldarerathis是的,它是一条线,但当我处理它似乎使它通过一定数量的值,然后给我的错误:b = map(float,lines) ValueError:无效文字为float():0.000 \t \t 0.000 0.000 0.000 \t \t \t 0.000 0.000 0.000 \t \t \t 0.000 0.000 0.000 \t \t \t 0.000 0。000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0是不实际通过价值观? – geop

+0

这看起来就像上面提到的那个字符串,但'\ t'显示为空格(即实际的制表符)。这是一个字符串文字,而不是一堆较短的文字,我猜测。 – eldarerathis

回答

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()是一个字符串列表,所以你尝试转换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]] 
+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]] 
+0

感谢您的帮助,这有助于我理解我的错误。我不明白的是,在错误被发现之前,一些日期是如何通过这个过程的?这是我的误解吗? – geop

+0

回答上面.... – geop