Python嵌套For循环不迭代数据

时间:2016-05-06 13:48:42

标签: python csv

我正在尝试比较两个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.

2 个答案:

答案 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文件,

编辑不会推荐这个解决方案。而是在同一个循环中迭代两个生成器,如下面的另一个解决方案所示