重置csv.reader()迭代器

时间:2016-12-05 22:50:25

标签: python csv

我正在尝试使用csv阅读器进行一些csv处理,并且遇到了一个问题,我必须迭代csv阅读器读取的行。但是在第二次迭代时,它会返回nil,因为所有行都已经被迭代了,有没有办法刷新迭代器再从头开始。

代码:

desc=open("example.csv","r")

Reader1=csv.read(desc)

for lines in Reader1:
(Some code)

for lines in Reader1:
(some code)

究竟想要做的是以下面的格式读取csv文件

ID,价格,名称 X,Y,Z A,B,C 并按以下格式重新排列 id:x a 价格:y b 名称:z c 不使用pandas库

1 个答案:

答案 0 :(得分:4)

使用seek重置基础文件对象,在第二个循环之前添加以下内容:

desc.seek(0)
# Apparently, csv.reader will not refresh if the file is seeked to 0,
# so recreate it
Reader1 = csv.reader(desc)  

请注意,如果内存不是问题,将输入读入list通常会更快,然后两次迭代list。或者,您可以use itertools.tee从初始迭代器生成两个迭代器(如果在启动另一个迭代器之前完全迭代一个迭代器,它需要类似的内存来啜选到list,但允许您立即开始迭代,而不是在处理任何文件之前等待整个文件的读取。这两种方法都避免了需要两次迭代文件的额外系统调用。在您创建tee的行之后的Reader1方法:

# It's not safe to reuse the argument to tee, so we replace it with one of
# the results of tee
Reader1, Reader2 = itertools.tee(Reader1)

for line in Reader1:
    ...

for line in Reader2:
    ...