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
相关产品推荐
相关产品推荐

