如何重置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
相关产品推荐
相关产品推荐

