第一次操作后Python3字典空白

第一次操作后Python3字典空白,python,python-3.x,csv,Python,Python 3.x,Csv,我正在将CSV文件读入Dictreader,并希望在终端上打印两次其内容。但它只打印了一次。第一次打印后读写器是空白的吗 dictreader = csv.DictReader(reader) for k in dictreader: print(k) # Prints all keys/values for i in dictreader: print(i) # Doesn't print anything 是的,如果您查看forDict

我正在将CSV文件读入Dictreader,并希望在终端上打印两次其内容。但它只打印了一次。第一次打印后读写器是空白的吗

dictreader = csv.DictReader(reader)

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

for i in dictreader:
    print(i)         # Doesn't print anything 
是的,如果您查看for
DictReader
,您会看到它是一个迭代器(它有一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


经过一次就会筋疲力尽;随后的迭代将不会产生任何结果。如果需要多次迭代,可以从中创建一个列表

All
csv
wrappers像对象一样包装文件。类文件对象具有状态,特别是查找位置(管道根本无法查找),因此包装器允许对象管理位置,解析接下来发生的任何内容

使迭代在一行中工作两次意味着
csv
包装器必须缓存文件内容(消耗无限量的内存)或要求它们查找回基础文件的开头(流式文件类对象不可能)

csv
包装器想象成半文件式,这样更容易掌握。您不能对myfile:
中的行执行两次
而不查找,同样,您也不能对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
,但这只有在所有迭代器都将同步(稍微)升级时才有帮助;如果要在开始下一个之前完成一个,通常只缓存到
列表
元组
会更快