我试图比较两个CSV文件(使用import csv
),得到了意想不到的结果。在
我能够正确地解析CSV,并且我得到了预期的输出,我需要根据它们适当的列数据适当地比较两个文件——从一个文件的电子邮件地址到另一个文件中的电子邮件地址。在
我不明白的是,当我运行这个时,第一个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.
在第一次通过
line in csv2
的内部循环之后,您已经耗尽了生成器csv2
。 所以基本上对于第一行,内部循环通过csv2执行。当您到达第二行时,csv2
实际上是空的。因此,您永远不会进入循环对所有其他行执行print。在一个快速的解决方法是在运行第一个for循环之前将csv2的行加载到一个列表中
^{1}$我建议你仔细阅读Python生成器,它们本质上是动态生成数据的列表,而不是让所有的数据都在那里等着你。所以你只需要检查每台发电机一次。在
编辑:如果您有非常大的csv文件,则不建议使用此解决方案。相反,在同一个循环中迭代两个生成器,如下面另一个解决方案所示
请在ipython或其他地方查看手册页->
一点都不好!如果您想要预期的行为,请稍后执行
csv2 = list(csv2)
操作:)有关解释,请参阅python参考中关于iterables的概念或(global leading;)7430-upvote-answer关于
yield
。。。在相关问题 更多 >
编程相关推荐