2012-12-17 25 views
3

在研究常見問題的選項(如何在迭代之前查找CSV閱讀器中的行數)時,我遇到了使用len(list(myCSVReader))的方法。是的,我知道這是多麼的可怕而且可能很昂貴,我不會使用它。不過,雖然與它玩,我碰到一個實在令人費解的不一致傳來:在CSV閱讀器上使用list()函數的不一致性

#myFile.txt is a 3-line CSV file 
myCSV = csv.reader(open('myFile.txt','rb'),dialect='excel') 
print(len(list(myCSV))) 
print(list(myCSV)) 

當我跑,我得到:

> 3 
> [] 

我能理解爲什麼你不能只使用list()轉換的讀者列表的清單,但如果是這樣的話,那麼爲什麼len()在這產生正確的結果?

- JDM

回答

6

這是當你從generator建立list會發生什麼。

  • 生成器是一個一個一個地產生項目的可迭代對象。在某個時刻,它已經耗盡。

  • csv.reader返回一個發生器。

  • 當您做list(generator)時,列表構造函數會消耗生成器中的所有項目。

  • 下一次嘗試從發生器獲取某些內容(例如,在另一次執行list(generator)時),它已經耗盡。

你可以做什麼是 一旦創建一個列表,並使用它需要的地方:

myCSV = list(csv.reader(open('myFile.txt','rb'),dialect='excel')) 
print(len(myCSV)) 
print(myCSV) 
+0

好吧,我現在明白了。所以,如果我反轉'print'行,我會得到列表的列表,然後是0. – JDM

+0

@ user1905392對。你只能得到一個項目。 –