2016-12-05 192 views
1

我正在嘗試使用csv讀取器進行一些csv處理,並且遇到了必須迭代由csv reader讀取的行的問題。但是在第二次迭代時,它返回nil,因爲所有的行都已經迭代了,是否有任何方法可以刷新迭代器以再次從頭開始。重置csv.reader()迭代器

代碼:

desc=open("example.csv","r") 

Reader1=csv.read(desc) 

for lines in Reader1: 
(Some code) 

for lines in Reader1: 
(some code) 

什麼是精確想做的事就是閱讀下面

ID,價格,名稱 X,Y,Z A,B,C 格式csv文件和重新排列在下方 ID的格式:XA 價格:YB 名稱:ZC 不使用熊貓庫

+1

如果您需要遍歷一次以上,消耗它變成一個列表 - 'all_lines =名單(Reader1)'。 – jonrsharpe

+0

會不會佔用額外的空間?因爲Reader1已經包含了所有的行。 –

+0

@PoojaGupta您可以執行'desc.seek(0)',然後創建一個新的迭代器以避免浪費文件描述符並且不將CSV保存在內存中。 –

回答

3

復位與seek底層的文件對象,第二個循環之前添加以下:

desc.seek(0) 
# Apparently, csv.reader will not refresh if the file is seeked to 0, 
# so recreate it 
Reader1 = csv.reader(desc) 

你要知道,如果內存是不是一個問題,它通常會更快地讀取輸入到list,則迭代list兩次。或者,你可以用use itertools.tee從初始迭代器創建兩個迭代器(如果在啓動另一個迭代器之前完全迭代一個迭代器,它需要類似的內存才能0123至list,但允許您立即開始迭代,而不是等待整個文件爲在你可以處理任何它之前閱讀)。這兩種方法都避免了兩次迭代文件所需的額外系統調用。該tee方法,該行之後創建Reader1上:

# It's not safe to reuse the argument to tee, so we replace it with one of 
# the results of tee 
Reader1, Reader2 = itertools.tee(Reader1) 

for line in Reader1: 
    ... 

for line in Reader2: 
    ... 
+0

雖然這似乎沒有自動重置迭代器。 –

+1

@musically_ut:啊。愚蠢的實施細節。很簡單,只是重新創建它。編輯。 – ShadowRanger