如何匹配双CSV文件ID,将指定字段追加至对应输出文件?
解决方案:匹配ID并追加Activity字段到输出文件
问题根源
你之前的嵌套循环失效的核心原因是:csv.reader返回的是一次性迭代器。第一次遍历sheetTwo后,迭代器指针走到末尾,后续循环再遍历sheetTwo不会返回任何数据,导致只有第一个rowOne可能匹配到结果,后续全失效。另外你的代码逻辑偏离需求——现在不需要再处理one.csv,而是要直接从已生成的file01.csv这类单记录文件中读取ID,去匹配two.csv。
正确思路
- 预存
two.csv的ID与对应Activity字段到字典,实现O(1)快速查找。 - 遍历所有单记录输出文件,读取每个文件的ID,从字典取对应Activity并追加到文件末尾。
完整代码
import csv import os directory = '/home/user/work/' # 1. 构建ID到Activity的映射字典 id_activity_map = {} with open(os.path.join(directory, 'two.csv'), 'r') as two_file: sheetTwo = csv.reader(two_file, delimiter=',') # 跳过two.csv的标题行(没有标题则删除此行) next(sheetTwo) for row in sheetTwo: # ID在第3列(索引2),Activity在第5列(索引4) id_val = row[2].strip() activity = row[4].strip() id_activity_map[id_val] = activity # 2. 遍历所有输出文件(匹配fileXX.csv格式) for filename in os.listdir(directory): if filename.startswith('file') and filename.endswith('.csv'): file_path = os.path.join(directory, filename) # 读取文件首行的ID(去除换行符与空格) with open(file_path, 'r') as f: file_id = f.readline().strip() # 查找对应Activity并追加 activity = id_activity_map.get(file_id) if activity: with open(file_path, 'a') as f: # 若原文件用分号分隔,可改为f.write(f';{activity}\n')保持格式一致 f.write(f'{activity}\n') print(f'已为{filename}追加Activity: {activity}') else: print(f'未在two.csv中找到{filename}对应的ID: {file_id}')
关键说明
- 用
os.path.join拼接路径,避免跨系统路径分隔符问题。 - 处理ID和Activity时加
strip(),避免空格导致匹配失败。 - 若输出文件首行是标题、第二行才是ID,把读取ID的代码改成
next(csv.reader(f))[0].strip()即可。
内容的提问来源于stack exchange,提问作者ObserverSwarm178
相关产品推荐
相关产品推荐

