Python嵌套for循环计数结果异常问题排查
问题分析与解决
你遇到的问题核心在于**csv.reader返回的是一次性迭代器**:当第一次外层循环(遍历_sx)执行时,内层循环会把y这个迭代器的所有6822行全部遍历完毕,迭代器的指针会移动到末尾。之后的每一次外层循环再进入内层循环时,y已经没有剩余元素可以迭代了,所以内层循环不会再执行任何代码,最终counter只累加了第一次内层循环的6822次,而非预期的28257*6822次。
解决方法
方案1:每次外层循环重新读取csv_file_b
把打开文件和创建csv.reader的操作放到外层循环内部,确保每次外层循环都能获取到完整的csv_file_b迭代器:
import csv def compare_data(csv_file_a, csv_file_b): fp_a = open(csv_file_a, mode="r", newline='') _sx = csv.reader(fp_a) counter = 0 for _x in _sx: # 每次外层循环重新初始化csv_file_b的读取器 fp_b = open(csv_file_b, mode="r", newline='') y = csv.reader(fp_b) for _item in y: counter += 1 if somecondition: print(something) else: print(something else) fp_b.close() fp_a.close() print(counter) compare_data(csv_file_a, csv_file_b)
方案2:预先把csv_file_b的内容读到列表中
先将csv_file_b的所有行加载到内存列表(列表支持重复遍历),避免重复打开文件:
import csv def compare_data(csv_file_a, csv_file_b): fp_a = open(csv_file_a, mode="r", newline='') _sx = csv.reader(fp_a) # 预先读取csv_file_b的所有行到列表 fp_b = open(csv_file_b, mode="r", newline='') y_list = list(csv.reader(fp_b)) fp_b.close() counter = 0 for _x in _sx: for _item in y_list: counter += 1 if somecondition: print(something) else: print(something else) fp_a.close() print(counter) compare_data(csv_file_a, csv_file_b)
注意:方案2适合csv_file_b体积较小的场景(内存占用可控);如果csv_file_b非常大,方案1更节省内存,但会多次IO操作,性能略低。
内容的提问来源于stack exchange,提问作者user14752375
相关产品推荐
相关产品推荐

