2016-12-05 153 views
1

我正在尝试使用csv读取器进行一些csv处理,并且遇到了必须迭代由csv reader读取的行的问题。但是在第二次迭代时,它返回nil,因为所有的行都已经迭代了,是否有任何方法可以刷新迭代器以再次从头开始。重置csv.reader()迭代器

代码:

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

Reader1=csv.read(desc) 

for lines in Reader1: 
(Some code) 

for lines in Reader1: 
(some code) 

什么是精确想做的事就是阅读下面

ID,价格,名称 X,Y,Z A,B,C 格式csv文件和重新排列在下方 ID的格式:XA 价格:YB 名称:ZC 不使用熊猫库

+1

如果您需要遍历一次以上,消耗它变成一个列表 - 'all_lines =名单(Reader1)'。 – jonrsharpe

+0

会不会占用额外的空间?因为Reader1已经包含了所有的行。 –

+0

@PoojaGupta您可以执行'desc.seek(0)',然后创建一个新的迭代器以避免浪费文件描述符并且不将CSV保存在内存中。 –

回答

3

复位与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从初始迭代器创建两个迭代器(如果在启动另一个迭代器之前完全迭代一个迭代器,它需要类似的内存才能0123至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: 
    ... 
+0

虽然这似乎没有自动重置迭代器。 –

+1

@musically_ut:啊。愚蠢的实施细节。很简单,只是重新创建它。编辑。 – ShadowRanger