You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

csv.reader无法重复迭代:嵌套循环内层仅执行一次问题排查

为什么嵌套循环里csv.reader的内层循环只执行一次?

你碰到的这个问题其实是因为csv.reader返回的是一个迭代器,而不是普通的列表——这是Python里迭代器的核心特性:迭代器只能被遍历一次,当你把里面的元素全部取完之后,它就会变成空的,后续再遍历它就不会有任何输出了。

具体到你的代码里:

第一次外层循环(x="A")的时候,你已经把myreader这个迭代器的所有行都遍历完了;等到外层循环走到x="B"和x="C"时,myreader里已经没有任何元素可以迭代了,所以内层的for y in myreader直接跳过,自然就看不到row1/row2/row3的输出了。

而你换成普通列表list2的时候能正常工作,是因为列表属于可重复迭代的对象——每次你开始一个新的内层循环,它都会从头开始遍历所有元素,不会像迭代器那样用完就空。

怎么解决这个问题?

有几种常见的处理方式,你可以根据自己的需求选择:

方案1:先把CSV内容转成列表(适合小文件)

把csv.reader的内容一次性转成普通列表,这样就可以重复遍历了:

import csv

datafile = open(r"my_file.csv", "r")
myreader = csv.reader(datafile, delimiter=",")
# 将所有行转存到列表里
all_rows = list(myreader)
list1 = ["A", "B", "C"]

for x in list1[:]:
    print(x)
    # 遍历列表而不是原迭代器
    for y in all_rows:
        print(y)

方案2:每次外层循环都重新读取文件(适合大文件)

如果你的CSV文件很大,不想一次性加载到内存里,可以每次外层循环时重新打开文件、创建新的csv.reader:

import csv

list1 = ["A", "B", "C"]

for x in list1[:]:
    print(x)
    # 每次循环都重新打开文件,生成新的迭代器
    with open(r"my_file.csv", "r") as datafile:
        myreader = csv.reader(datafile, delimiter=",")
        for y in myreader:
            print(y)

(用with语句还能自动帮你关闭文件,比手动open更安全)

方案3:重置文件指针(需要文件支持seek)

如果不想重新打开文件,可以把文件指针移回文件开头,然后重新创建csv.reader(注意如果有表头的话,可能需要重新跳过表头):

import csv

datafile = open(r"my_file.csv", "r")
list1 = ["A", "B", "C"]

for x in list1[:]:
    print(x)
    # 把文件指针移到文件开头
    datafile.seek(0)
    # 重新创建reader
    myreader = csv.reader(datafile, delimiter=",")
    for y in myreader:
        print(y)

补充验证

你可以做个小测试:先遍历一次myreader,再遍历第二次,就会发现第二次没有任何输出:

datafile = open(r"my_file.csv", "r")
myreader = csv.reader(datafile, delimiter=",")

# 第一次遍历
print("第一次遍历:")
for row in myreader:
    print(row)

# 第二次遍历
print("\n第二次遍历:")
for row in myreader:
    print(row)  # 这里不会有任何输出,因为迭代器已经空了

内容的提问来源于stack exchange,提问作者China Diapers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:44:17