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

Python中for entry in csv_compare循环仅迭代一次的问题排查

解决CSV文件对比时内层循环仅迭代一次的问题

问题根源

csv.reader()返回的是迭代器对象,迭代器的特性是只能被完整遍历一次。第一次外层循环执行时,内层循环已经把csv_compare的所有条目遍历完毕,后续外层循环再进入内层循环时,csv_compare已经没有剩余数据可以迭代,所以内层循环不再执行。

方案一:将对比数据转为列表(可重复遍历)

把对比文件的所有条目提前读取到列表中,这样每次外层循环都能从头遍历所有对比条目:

import csv
finalCSV = {}
with open('input.csv', newline='') as csvfile, open('compare.csv', newline='') as keyCSVFile, open('output.csv', 'w' ,newline='') as OutputCSV:
    csv_input = csv.reader(csvfile)
    csv_compare = csv.reader(keyCSVFile)
    # 将对比文件的所有条目转为列表,支持重复遍历
    compare_entries = list(csv_compare)
    csv_output = csv.writer(OutputCSV)
    csv_output.writerow(next(csv_input))

    for row in csv_input:
        # 遍历列表而非原迭代器
        for entry in compare_entries:
            print(row[0] + ' ' + entry[0])
            if row[0] == entry[0]:
                csv_output.writerow(row)
                break
    
print('wait...')

方案二:用集合存储对比Key(更高效)

如果只需要对比第一列的Key,建议把对比文件的Key存入集合,利用集合O(1)的查找效率替代嵌套循环,大幅提升性能(尤其适合大文件):

import csv
finalCSV = {}
with open('input.csv', newline='') as csvfile, open('compare.csv', newline='') as keyCSVFile, open('output.csv', 'w' ,newline='') as OutputCSV:
    csv_input = csv.reader(csvfile)
    csv_compare = csv.reader(keyCSVFile)
    # 提取对比文件的所有Key到集合
    compare_keys = {entry[0] for entry in csv_compare}
    csv_output = csv.writer(OutputCSV)
    csv_output.writerow(next(csv_input))

    for row in csv_input:
        if row[0] in compare_keys:
            print(row[0])
            csv_output.writerow(row)
    
print('wait...')

内容的提问来源于stack exchange,提问作者Zac Borders

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:20:37