2017-05-24 74 views
0

我正在讀取一個CSV文件到Dictreader並希望在終端上打印兩次它的內容。但它只打印一次。首次印刷後是Dictreader BLANK嗎?Python3詞典BLANK第一次操作後

dictreader = csv.DictReader(reader) 

for k in dictreader: 
    print(k)   # Prints all keys/values 

for i in dictreader: 
    print(i)   # Doesn't print anything 

回答

0

是的,如果你看一下sourceDictReader你會看到它是一個迭代器(具有__next____iter__返回self實現)。

經過它一旦它會被用盡;隨之而來的迭代將不會產生任何東西。如果需要多次迭代,可以從中創建一個列表。

0

全部csv包裝包裝類似文件的對象。類文件對象具有狀態,特別是查找位置(並且管道根本無法查找),因此封裝程序允許對象管理位置,解析接下來的任何內容。

使迭代連續工作兩次將意味着csv包裝必須緩存文件內容(消耗無限量的內存)或要求它們回溯到底層文件的開始處(不可能用於流式文件對象)。

想象一下csv包裝文件就像半文件一樣可以更容易掌握。連續兩次都不能連續執行for line in myfile:,同樣,連續兩次不能執行for row in mycsv:,而無需查找底層文件類對象。

假設你的讀者可搜索,你可以通過做重複兩次(不消耗無限的記憶):

dictreader = csv.DictReader(reader) 

for k in dictreader: 
    print(k)   # Prints all keys/values 

reader.seek(0) # Restart from beginning 

for i in dictreader: 
    print(i)   # Prints all keys/values 

,或者如果文件被稱爲是小,你可以緩存:

# Cache reusable values 
dictlines = tuple(csv.DictReader(reader)) 

for k in dictlines: 
    print(k)   # Prints all keys/values 

for i in dictlines: 
    print(i)   # Prints all keys/values 

您也可以使用itertools.tee來達到同樣的目的,但這隻有在所有迭代器都會先進(有點)先進時纔有用;如果您在開始下一個操作前完成一個完成操作,則緩存到listtuple通常會更快。