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

如何重置Python csv.DictReader至第二行以匹配CSV数据行?

解决CSV文件匹配时重置reader到数据起始行的问题

你的问题核心是:csv.DictReader遍历一次后就会耗尽迭代器,后续无法再读取数据,因此每次循环reader1时需要让reader2回到数据起始状态。下面提供两种可行方案:

方案一:重置文件指针并重新初始化DictReader

每次循环row1时,将file2的文件指针移到开头,然后重新创建DictReader(它会自动重新读取表头,后续遍历从第一行数据开始)。

修改后的代码片段:

import csv

with open('file1.csv') as file1, open('file2.csv') as file2:
    reader1 = csv.DictReader(file1)
    merged_rows = []

    for row1 in reader1:
        contact_no = row1['contact_no']
        
        # 重置file2指针到开头,重新初始化reader2
        file2.seek(0)
        reader2 = csv.DictReader(file2)

        for row2 in reader2:
            if row2['contact_no'] == contact_no:
                row1.update(row2)
                merged_rows.append(row1)

    # 写入合并文件部分不变
    with open('merged_file.csv', 'w') as out_file:
        writer = csv.DictWriter(out_file, fieldnames=row1.keys())
        writer.writeheader()
        for row in merged_rows:
            writer.writerow(row)

方案二:预加载file2数据到内存(更高效)

如果file2体积不大,建议直接把所有数据行读到内存列表中,后续循环直接遍历列表,避免重复操作文件指针和初始化reader,效率更高。

修改后的完整代码:

import csv

with open('file1.csv') as file1, open('file2.csv') as file2:
    reader1 = csv.DictReader(file1)
    # 一次性读取file2所有数据行到内存
    reader2 = csv.DictReader(file2)
    file2_rows = list(reader2)

    merged_rows = []

    for row1 in reader1:
        contact_no = row1['contact_no']
        
        # 直接遍历内存中的file2数据行
        for row2 in file2_rows:
            if row2['contact_no'] == contact_no:
                row1.update(row2)
                merged_rows.append(row1)

    with open('merged_file.csv', 'w') as out_file:
        writer = csv.DictWriter(out_file, fieldnames=row1.keys())
        writer.writeheader()
        for row in merged_rows:
            writer.writerow(row)

注意事项

  • row1.update(row2)会用row2的键值对覆盖row1中同名的键,如果两个文件有重复表头字段,需要确认是否需要这种覆盖逻辑。
  • 若file2文件非常大,方案一更节省内存;小文件优先选方案二。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:35:21