第一次操作后的Python3 Dictionary BLANK

时间:2017-05-24 19:40:57

标签: python python-3.x csv

我正在将一个CSV文件读入Dictreader,并希望在终端上打印两次内容。但它只打印一次。首次打印后是Dictreader BLANK吗?

create table images
(
   id    integer primary key, 
   data  blob
);

2 个答案:

答案 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用于相同的目的,但这只有在所有迭代器将要串联前进的情况下才有用;如果你在开始下一个之前运行一个完成,那么通常可以更快地缓存到listtuple