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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:52:15