Python:为啥这个 for 循环在第一次迭代后退出?

Posted

技术标签:

【中文标题】Python:为啥这个 for 循环在第一次迭代后退出?【英文标题】:Python: Why is this for loop exiting after the first iteration?Python:为什么这个 for 循环在第一次迭代后退出? 【发布时间】:2019-08-29 22:50:01 【问题描述】:

我正在尝试做的事情:我正在从 csv 导入并尝试遍历数据以检查匹配项。

我尝试过的: 我正在尝试一个嵌套的 for 循环,遍历较大的列表,并检查较小列表中的每个项目。

仅供参考,“农药名称”是 d_reader 文件中列的标题,因此它是键名。

agqfile=open("GCLC-USA-1.csv")
csv_a=csv.reader(agqfile)

d_reader=csv.DictReader(open("Pesticide_output.csv"))

 for row in d_reader:
#     print (row['Pesticide Name'])
    for chem in csv_a:
        print(chem[0],row['Pesticide Name'])
        if chem[0] in row['Pesticide Name']:
             print(chem[0],"found in ",row['Pesticide Name'])
 #     print(row['Pesticide Name'])

我的期望: 外部循环在完成之前不应退出,但在第一次迭代后退出。 但是,如果我在第二个(嵌套的)for 循环之前放置一个 print 语句,它会打印每次迭代。

我不明白这种行为!请你帮我解释一下吗?

我试图让这个问题尽可能简短,但如果您需要更多信息,例如数据样本或打印数据类型,那么我可以提供。

【问题讨论】:

【参考方案1】:

内部循环在第一次外部迭代中耗尽了文件对象csv_a,因此其他外部行永远不会进入内部循环。 您必须将内容存储在列表中:

agqfile=open("GCLC-USA-1.csv")
csv_a = list(csv.reader(agqfile))

d_reader=csv.DictReader(open("Pesticide_output.csv"))

for row in d_reader:
#     print (row['Pesticide Name'])
    for chem in csv_a:
        print(chem[0],row['Pesticide Name'])
        if chem[0] in row['Pesticide Name']:
             print(chem[0],"found in ",row['Pesticide Name'])
 #     print(row['Pesticide Name'])

【讨论】:

非常感谢! 其实,虽然你的回答有帮助,但我还是不明白这里的逻辑,@Daniel。即使内部 for 循环耗尽了较短的对象,它不应该继续进行外部循环的下一次迭代吗?显然我误解了一些东西。 @Jimmy9zz:您自己给出了答案:“但是,如果我在第二个(嵌套)for 循环之前放置一个 print 语句,它会打印每次迭代。”这样外循环就结束了。

以上是关于Python:为啥这个 for 循环在第一次迭代后退出?的主要内容,如果未能解决你的问题,请参考以下文章

为啥for循环遍历python中的1个项目? [关闭]

Python for 循环在第一次迭代后停止

为啥我可以在 Python for 循环中对迭代器和序列使用相同的名称?

为啥我在 PL/SQL 中的 for 循环没有打印出最后一次迭代

For循环中的Python最后一次迭代

Python多处理,在循环中多次使用池在第一次迭代后卡住