我正在尝试比较两个CSV文件(使用import csv
)并且我得到了意想不到的结果。
我能够正确地解析CSV并且我得到了我需要的预期输出,我需要根据它们的相应列数据正确比较这两个文件 - 从一个文件到另一个文件中的电子邮件地址的电子邮件地址。 / p>
我不明白的是,当我运行它时,第一个print row
语句只显示CSV中的第一个条目。如果我将print row
移动到内部for
循环的上方或下方,则会正确迭代所有行。
实际上它只是将csv1
中的第一行与csv2
中的所有行进行比较。
csv1
是来自csv2
的潜在值的子集。
import csv
csv1 = csv.reader(csv1)
csv2 = csv.reader(csv2)
for row in csv1:
# 'print row' works fine here.
for line in csv2:
print row #<----- First Print Row Statement
if row[2].lower() == line[2].lower():
print row
elif row[2].replace('olddomain.com','newdomain.com') == line[2]:
print row
# 'print row' works fine here too.
答案 0 :(得分:2)
在ipython或其他地方csv.reader?
查看联系人页面 - &gt;
[...]返回的对象是一个迭代器。
不是可迭代的!如果您想要预期的行为,请事后csv2 = list(csv2)
:)
有关解释,请参阅有关iterables概念的python参考或关于yield
的{全球领先;))7430-upvote-answer ...
答案 1 :(得分:0)
第一次通过line in csv2
的内循环后,你已经耗尽了生成器csv2
。
所以基本上对于第一行,内部循环一直执行csv2。当你到达第二行时,csv2
基本上是空的。因此,您永远不会进入循环以在所有其他行上执行打印。
快速解决方法是在运行第一个for循环之前将csv2行加载到列表中
csv2_list = [x for x in csv2]
for row in csv1:
# 'print row' works fine here.
for line in csv2_list:
# print row should now work here
我建议阅读Python生成器,它们基本上是动态生成数据的列表,而不是让它们等着你。所以你只需要经过一次发电机。
如果你有非常大的csv文件,编辑不会推荐这个解决方案。而是在同一个循环中迭代两个生成器,如下面的另一个解决方案所示