2016-03-31 86 views
1

我有一個名爲「foo.txt的」的文本文件,用號碼的列表,每行一個,例如:讀取文本文件和字符串轉換爲float

0.094195 
0.216867 
0.326396 
0.525739 
0.592552 
0.600219 
0.637459 
0.642935 
0.662651 
0.657174 
0.683461 

我現在想讀這些數字放到一個Python列表中。我的代碼要做到這一點,如下所示:

x = [] 
file_in = open('foo.dat', 'r') 
for y in file_in.read().split('\n'): 
    x.append(float(y)) 

但是,這給我的錯誤:

ValueError: could not convert string to float 

我在做什麼錯?

+2

你的文件末尾是否有空行? – khelwood

+2

您應該在'x.append(float(y))'行之前'print(y)'查看哪些值無法轉換。 –

+0

爲什麼你會分裂('\ n')'? ...讓它'split()' –

回答

2

編輯

的評論說:martineau: 你也可以使用if y:消除None或空字符串。

原來的答案:

它失敗,因爲你正在使用換行符作爲分隔符,因此最後一個元素是空字符串

您可以添加y.isdigit()檢查y是否數字。

x = [] 
file_in = open('sample.csv', 'r') 
for y in file_in.read().split('\n'): 
    if y.isdigit(): 
     x.append(float(y)) 

OR

你可以改變read().split("\n")readlines()

OR

從y中取出前/後的字符。它處理額外的空格

for y in file_in: 
    trimed_line = y.strip() # leading or trailing characters are removed 
+0

也可以說'if y:','append(float(y))'。 – martineau

+0

@martineau不能同意更多!消除'無'或空字符串 – haifzhan

1

通常文件在最後有空行,所以可能你試圖將空字符串轉換爲浮點。

相反的file_in.read().split('\n')你可以使用:

for line in file_in.readlines(): 
    x.append(float(line)) 

方法readlines返回從給定文件中的所有行的列表,並跳過最後一個空行,如果存在的話。

1

您可以嘗試使用默認的浮動功能

>>> float("1.1") 
1.1 

你也可以使用Python嘗試將運行代碼else語句,直到抓到一個錯誤嘗試與線運行一個else語句。

try: 
    try_this(whatever that might bring up a error) 
except SomeException as exception: 
    #Handle exception 
else: 
    return something 

有可能是文件的空白行結束可能會產生錯誤。因爲它,請嘗試使用try else語句。

0

我想你是這樣的字符串: '0.1111,0。1111或其他

file_in = open('foo.dat', 'r') 
for y in file_in.readlines()[0]: 
    x.append(float(y)) 
1

如何對這種做法:

x = [] 
with open('foo.dat', 'r') as f: 
    for line in f: 
     if line: #avoid blank lines 
      x.append(float(line.strip())) 

或者:

with open('foo.dat', 'r') as f: 
    lines = (line.strip() for line in f if line) 
    x = [float(line) for line in lines] 

最後更緊湊:

with open('foo.dat', 'r') as f: 
    x = [float(line.strip()) for line in lines if line] 

這樣你就不必擔心空白行,並做出適當的轉換m stringfloat

0

您可以使用函數來判斷您要解析的字符串是否是數字。基於這個問題1你可以這樣做:

def is_number(s): 
try: 
    float(s) 
    return True 
except ValueError: 
    return False 

x = [] 
file_in = open('foo.dat', 'r') 
for y in file_in.read().split('\n'): 
    if is_number(y): 
     x.append(float(y))