2017-07-07 159 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] 
>>>