2017-07-07 114 views
3

我输入文件的形式:阅读从文件彩车与蟒蛇

5.0, 1000.0, 100000000000000.0, 115.2712, 230.538, 345.796, 461.0408, 
1.053E-09, 1.839E-09, 1.632E-10, 1.959E-12, 4.109, 3.683, 3.586, 3.650 

,每一个数量基本上在一条线上。

我想要做的是读取所有浮点数,然后将7到10列仅添加到数组中。

下面是我写的东西:

T=[] 
with open("test.txt", "r") as file1: 
    for line in file1.readlines(): 
     f_list = [float(i) for i in line.split(",")] 
     T.append(float(f_list[7])) 
     T.append(float(f_list[8])) 
     T.append(float(f_list[9])) 
     T.append(float(f_list[10])) 

当我运行上面我得到:

ValueError: could not convert string to float: 

我觉得有一些错误的float(i)一部分,但我无法找到一个绕过它。

我见过有类似问题的人在这里,但迄今为止我所尝试的修复都没有帮助。任何帮助是极大的赞赏。

+0

在那里的某个地方,有些东西不是浮动文本。检查文件。 –

+0

@ IgnacioVazquez-Abrams可能是他的第一行的尾部空间导致错误。这将导致产生空字符串。当它传递给float()时,它失败。 –

+0

我不明白。每一条浮线都是一条线,但你有列?你的意思是行,还是每条线上都有不止一个浮点数? –

回答

4

没有问题是,你的第一行用逗号结束:

5.0, 1000.0, 100000000000000.0, 115.2712, 230.538, 345.796, 461.0408, 
1.053E-09, 1.839E-09, 1.632E-10, 1.959E-12, 4.109, 3.683, 3.586, 3.650 

因此,要处理的字符串只包含空格(如' ')。而且float(' ')失败,因为它不是一个数字(它实际上报告此):

>>> float(' ') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: could not convert string to float: 
>>> float('a') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: could not convert string to float: 'a' 

但是打印时的空间简直是看不见的。

您可以通过添加一个筛选语句到列表理解解决这个问题:

T = [] 
with open("test.txt", "r") as file1: 
    for line in file1.readlines(): 
     f_list = [float(i) for i in line.split(",")if i.strip()] 
     T += f_list[7:11]

而且这将工作,因为没有一行的有7-11浮动。所以你永远不会添加这些浮标。

但是,您可以使用下面的代码:

with open("test.txt", "r") as file1: 
    f_list = [float(i) for line in file1 for i in line.split(',') if i.strip()] 
    T = f_list[7:11] 

这将导致T等于:

>>> T 
[1.053e-09, 1.839e-09, 1.632e-10, 1.959e-12] 
2

您的问题是,当你分割line,结果列表中极有可能包含空白。这会导致float()失败。您需要首先通过测试元素是否为有效的浮点数来清理分割列表。例如:

>>> def is_float(n): 
    try: 
     float(n) 
     return True 
    except: 
     return False 


>>> 
>>> line = '5.0, 1000.0, 100000000000000.0, 115.2712, 230.538, 345.796, 461.0408,' 
>>> lst = [float(n) for n in line.split(',') if is_float(n)] 
>>> lst 
[5.0, 1000.0, 100000000000000.0, 115.2712, 230.538, 345.796, 461.0408] 
>>>