我正在将一个CSV文件读入Dictreader,并希望在终端上打印两次内容。但它只打印一次。首次打印后是Dictreader BLANK吗?
create table images
(
id integer primary key,
data blob
);
答案 0 :(得分:0)
是的,如果您查看DictReader
的{{3}},您会看到它是一个迭代器(有__next__
的实现,__iter__
返回self
)。
经过一次就会筋疲力尽;随后的迭代根本不会产生任何结果。如果需要多次迭代,可以从中创建一个列表。
答案 1 :(得分: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
用于相同的目的,但这只有在所有迭代器将要串联前进的情况下才有用;如果你在开始下一个之前运行一个完成,那么通常可以更快地缓存到list
或tuple
。