重置csv.reader()迭代器

4
我将尝试使用csv reader进行一些csv处理,但遇到了一个问题,需要迭代由csv reader读取的行。 但是,在第二次迭代时,由于所有行已经被迭代过,它会返回nil。 是否有办法刷新迭代器以重新开始迭代。
代码:
desc=open("example.csv","r")

Reader1=csv.read(desc)

for lines in Reader1:
(Some code)

for lines in Reader1:
(some code)

我要做的是按照下面的格式读取csv文件:

id,price,name x,y,z a,b,c 并将其重新排列成以下格式: id:x a price: y b name: z c 不使用pandas库。


2
如果您需要多次迭代它,请将其转换为列表 - all_lines = list(Reader1) - jonrsharpe
那不会占用额外的空间吗?因为Reader1已经拥有了所有的行。 - Pooja Gupta
1
@PoojaGupta 你可以执行 desc.seek(0),然后创建一个新的迭代器,以避免浪费文件描述符并不将 CSV 文件保存在内存中。 - musically_ut
它并不包含所有的行 - 这就是为仅能使用一次的原因,它是一个惰性迭代器。但是,是的,拥有一个列表将占用空间,这是一种权衡。 - jonrsharpe
1个回答

7

在第二个循环之前使用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 会更快。或者,您可以使用 itertools.tee 从初始迭代器创建两个迭代器(如果在开始另一个迭代器之前完全迭代一个迭代器,则需要类似于 slurping 到 list 的内存,但允许您立即开始迭代,而不是等待整个文件被读取才能处理其中任何部分)。任何一种方法都避免了迭代两次文件所涉及的额外系统调用。在您创建 Reader1 后,tee 方法如下:
# 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:
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接