全部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
來達到同樣的目的,但這隻有在所有迭代器都會先進(有點)先進時纔有用;如果您在開始下一個操作前完成一個完成操作,則緩存到list
或tuple
通常會更快。