Python嵌套For循环不迭代

2024-05-19 10:23:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图比较两个CSV文件(使用import csv),得到了意想不到的结果。在

我能够正确地解析CSV,并且我得到了预期的输出,我需要根据它们适当的列数据适当地比较两个文件——从一个文件的电子邮件地址到另一个文件中的电子邮件地址。在

我不明白的是,当我运行这个时,第一个print row语句只显示CSV中的第一个条目。如果我将print row移动到内部for循环的上方或下方,它将正确地迭代所有行。在

实际上,它只将csv1中的第一行与csv2中的所有行进行比较。在

csv1csv2中潜在值的子集。在

 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.

Tags: 文件csvinimportfor电子邮件地址line
2条回答

在第一次通过line in csv2的内部循环之后,您已经耗尽了生成器csv2。 所以基本上对于第一行,内部循环通过csv2执行。当您到达第二行时,csv2实际上是空的。因此,您永远不会进入循环对所有其他行执行print。在

一个快速的解决方法是在运行第一个for循环之前将csv2的行加载到一个列表中

^{1}$

我建议你仔细阅读Python生成器,它们本质上是动态生成数据的列表,而不是让所有的数据都在那里等着你。所以你只需要检查每台发电机一次。在

编辑:如果您有非常大的csv文件,则不建议使用此解决方案。相反,在同一个循环中迭代两个生成器,如下面另一个解决方案所示

请在ipython或其他地方查看手册页->

[...] the returned object is an iterator.

一点都不好!如果您想要预期的行为,请稍后执行csv2 = list(csv2)操作:)

有关解释,请参阅python参考中关于iterables的概念或(global leading;)7430-upvote-answer关于yield。。。在

相关问题 更多 >

    热门问题