2017-04-20 100 views
0

我有這樣的文件中的內容,我想從中提取只浮點值。該文本文件也包含新行,它也應該在Python中刪除。Python:如何從文本文件中提取浮點值?

hub,0.0166 
cord,0.0166 
ever,0.0332 
switch,0.0498 
sleep,0.06639 
allow,0.09959 

work,0.14939 

我已經試過這樣:

newDict = list() 
for words in file: 
    splitline = words.split() 
    newDict.append("{0}\t{1}".format(splitline[0],log(float(splitline[1])))) 
    newDict[float(splitline[0])] = ",".join(splitline[1:]) 
print(newDict) 

我觀察到的錯誤是:

Traceback (most recent call last): 
    File "G:\Setups\Python\chi-1.py", line 11, in <module> 
    newDict.append("{0}\t{1}".format(splitline[0],log(float(splitline[1])))) 
IndexError: list index out of range 

但我並沒有有任何輸出這表明我的錯誤。循環中的變量文件包含文本文件。因此,如果有人知道如何只提取浮點數。善意幫助它。

由於提前

+0

什麼錯誤 – Surajano

+0

你忘了分隔符:'分裂線= words.split( '')' –

+0

將它顯示錯誤--- '回溯(最近通話最後一個): 文件「G:\設置\ Python \ chi-1.py「第17行 newDict [float(splitline [0])] =」,「。join(splitline [1:]) ValueError:無法將字符串轉換爲float:' –

回答

0

如果這不是一個大文件,

import re 
with open('file.txt') as f: 
    print(re.findall('\d*?\.\d+', f.read())) 
0

您可以使用csv模塊,使其稍微簡單:

from math import log 

l = [] 

with open('path/to/file', 'r') as f: 
    csv_f = csv.reader(f, delimiter=',') 

    for row in csv_f: 
     l.append(log(float(row[1]))) 

print l 

輸出:

-4.09835258362 
-4.09835258362 
-3.40520540306 
-2.99974029495 
-2.71220883625 
-2.30669352104 
-1.90119494293 
0

斯普利特和IndexError: list index out of range例外

words變量你得到hub,0.0166\n值。

所以splitline = words.split()不適合你,因爲默認split使用space, \n, \t拆分字符串。使用splitline = words.strip().split(",")分割字符串。

類型轉換

作爲第一個項目從splitlinestring type,所以我們不能轉換爲浮動。

float(splitline[0])是不正確的說法。

變量名

  1. newDict:您可以定義newDict變量list,變量給予適當的名稱,因爲根據名稱變量類型是字典,螺母它不是如此。將名稱命名爲newList或'result_list'或任何有意義的名稱。

  2. 您將newDict定義爲列表結構,並且您可以像字典一樣指定值。 newDict[splitline[0]] = ",".join(splitline[1:])這將不起作用,因爲newDict是列表,而不是字典數據類型。

  3. file:文件是Python中的保留字,不要使用這樣的名稱作爲變量名。

0

您所犯的錯誤是您的代碼假定每個splitline列表中總會有至少兩個項目。這不會是這種情況,如果a)該行沒有有效的.split()函數分隔符,或b)你有一個空行。因此,splitline[1]返回您看到的IndexError

如上所述,您需要指定.split()的分隔符爲',',因爲.split()使用空格作爲默認分隔符。

您提到該文本文件包含「新行」,我認爲這意味着空行?如果是這種情況,則需要在代碼中進行說明。您可以檢查列表的長度,並確保你只當它的長度大於1操作就可以了:

new_list = [] 
for row in data: 
    split_row = row.split(',') 
    if len(split_row) > 1: 
    new_list.append(float(split_row[1])) 

這將從您的文本文件中提取所有浮點值,並將其存儲爲花車在一個單獨的列表。