2013-05-25 30 views
1
rows = [] 
FILE = open("testing.txt", "r") 
for blob in FILE: rows.append([int(i) for i in blob.split(" ")]) 

這裏testing.txt包含無效字面INT()與基礎文件10只包含整數

01 23 04 05 67 
08 09 10 
11 
12 

但是當我運行的代碼,我得到以下錯誤:

ValueError        Traceback (most recent call last) 
<ipython-input-1-2086c8bf9ab4> in <module>() 
     1 rows = [] 
     2 FILE = open("testing.txt", "r") 
----> 3 for blob in FILE: rows.append([int(i) for i in blob.split(" ")]) 

ValueError: invalid literal for int() with base 10: '' 

所以我的問題是:int()有什麼問題?我認爲如果參數是一個整數是完全可以的(例如int(5) == 5)。謝謝。

+0

你不應該使用列表(f)或f.readlines()來獲取到文件中的行? – Powertieke

+0

Peter Varo:是的,當我擺脫'\ n'並確保每個連續數字之間只有一個空格時,它就可以工作。但是爲什麼當這個鏈接中的作者能夠在triangle.txt包含100行時成功? –

+0

triange.txt

回答

1

顯然你的testing.txt在最後有新行代碼。在列表理解中添加if

for blob in FILE: 
    rows.append([int(i) for i in blob.split(" ") if i.isdigit()]) 
+0

這是我的第一個猜測,但我刪除了它.. ..該死:) :) –

+0

'如果我'工作如何? –

+0

@YifengXu如果需要檢查迭代器的值(來自split的列表)。更多在這裏 - http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions – ndpu

2

問題,如上所述,是換行符。

我建議使用split()而不是split(" ")。這會將所有空格視爲分隔符,包括換行符。因此,您將避免\nint()的呼叫。

+0

+1迄今最好的解決方案。 –

+0

A. E. Drew:我認爲當它到達下一行時,我們的意圖是在「行」中附加一個新條目。例如,如果該文件包含:1 \ n 2 3,我期待'rows == [[1],[2,3]]' –

+0

@YifengXu,我想你會用'分裂()'。每行仍然分別附加在for循環中。你只需避免在你的列表理解中對''\ n''運行'int()'。唯一的區別是空行會將空列表追加到行而不是引起錯誤。 –

0

你可以把一切都變成可讀的一行:

with open('testing.txt') as fobj: 
    rows = [[int(item) for item in row.split()] for row in fobj if row.strip()] 

with將保證你迪登後,你離開的背景,即後該文件將被關閉。順便說一下,split()沒有參數是特別是 旨在拆分文件中找到的行,因爲它分裂爲所有空格字符:' \t\r\n\v\f'。要避免空行的空列表,請檢查row.strip()是否爲真。

0

我想我會寫你的代碼如下所示:

with open('testing.txt','r') as f: 
    data=[[int(n) for n in line.strip().split()] for line in f] 
相關問題