我有一个包含CSV内容的字符串。我把它变成了这样一个列表:
from StringIO import StringIO
import csv
f = StringIO(list_csv)
my_list = csv.reader(f, delimiter=',')
现在我想在列表上循环两次,但是第二次尝试循环时,代码就像列表为空一样:
for item in my_list:
code = item[1]
print "code: "+code
for item in my_list:
desc = item[2]
print "desc: "+desc
(此代码为了演示目的而简化,我无法在单个循环中组合执行)
我认为列表仍然附加到StringIO,当它完成循环时它已完成读取,因此它不会再次读取。是否有一个单行将其转换为内存中的常规列表,我可以循环多次?我觉得像手动循环复制值是重新发明轮子....但如果没有其他选择,我可以这样做。只是要求代码不那么冗长的代码。谢谢!
答案 0 :(得分:4)
问题是my_list
实际上不是列表。它是iterator(在这种特殊情况下实际上是reader object,它只是一种迭代器)。
在第一次产生所有值之后消耗迭代器。这就是mylist
发生的事情:在你第一次循环之后,读者对象已经被消耗掉了,不能再次迭代了。
一种解决方案是将内容存储在实际的list
对象中。这应该解决它:
my_list = list(csv.reader(f, delimiter=','))
...然后像以前一样继续。
顺便说一句,如果您使用的是最新版本的Python 3,那么可以使用非常好的语法将迭代器解压缩到列表中:
my_list = [*csv.reader(f, delimiter=',')]
答案 1 :(得分:0)
使用以下代码:
my_list = list(csv.reader(f, delimiter=','))
答案 2 :(得分:0)
在itertools中使用tee函数,它可以为您提供对迭代器的更多访问,而不仅仅是一次。
from itertools import tee
i1, i2 = tee(my_list)
for i in i1:
pass
for i in i2:
pass