2014-01-15 81 views
1

當我運行在Python IDLE殼牌以下:蟒環不會在第二次通過迭代

f = open(r"H:\Test\test.csv", "rb") 
for line in f: 
    print line 
    #this works fine 
然而

,當我運行在第二時間以下:

for line in f: 
    print line 
    #this does nothing 
+1

[這可能有助於](http://docs.python.org/2/library/stdtypes.html#file.tell)。 – wim

回答

4

這不起作用,因爲你已經第一次搜索到文件的末尾。您需要倒帶(使用.seek(0))或重新打開文件。

其他一些指針:

  1. Python有一個很好的csv模塊。不要試圖自己實施CSV解析,除非這是一個教育練習。
  2. 您可能想要打開'rU'模式下的文件,而不是'rb''rU'是通用換行符模式,它將處理來自具有不同行結尾的平臺的源文件。
  3. 處理文件對象時使用with,因爲即使在出現錯誤的情況下,它也會爲您清理手柄。例如:

with open(r"H:\Test\test.csv", "rU") as f: 
    for line in f: 
     ... 
+0

使用csv模塊讀取文件的好處。它也允許我使用列表索引,這是我需要的。 –

+0

列表中是否有類似的重新設置功能?我遇到類似的情況,我在列表中打印這些項目並且它第一次工作,但是然後我輸入相同的代碼,並且它什麼都不打印。我必須刪除列表並重新創建它。我使用的是Python IDLE shell,如果這很重要 –

+0

@ wannabe_n00b請在單獨的問題中詢問並顯示您的代碼。 – TkTech

2

因爲你已經走了所有的方式,通過CSV文件,迭代器被耗盡。您需要在第二次循環之前重新打開它。

+0

使用seek(0)是另一種選擇,應該具有較少的開銷(不顯着)並避免讀/寫併發潛在問題。 –

3

你可以從變量中的文件中讀取數據,然後你可以迭代這個數據任何沒有。你想要在你的腳本中的時間。這比來回做seek要好。

f = open(r"H:\Test\test.csv", "rb") 
data = f.readlines() 
for line in data: 
     print line 

for line in data: 
     print line 

輸出:

# This is test.csv 

Line1,This is line 1, there are, some numbers here,321423423 

Line2,This is line2 , there are some characters here,sdfdsfdsf 

# This is test.csv 

Line1,This is line 1, there are, some numbers here,321423423 

Line2,This is line2 , there are some characters here,sdfdsfdsf 
+0

這取決於您加載的CSV。通常,當我們處理來自客戶的CSV文件時,它們的大小是多GB。與將其全部加載到內存中相比,「seek(0)」非常便宜。 – TkTech

相關問題