CSV文件交叉匹配、数据更新及不匹配行处理方案咨询
优化方案及删除不匹配行的实现
先点明你现有代码的几个核心问题:
- 遍历csv1每一行都重复读取csv2,数据量大时效率极低
- 写入文件用了
r只读模式,根本无法写入,逻辑完全错误 - 没有保留csv1原有列数据,直接写入固定两列,会丢失原始信息
以下是更高效的实现,同时完成匹配时将Project Name插入第二列、不匹配行直接丢弃的需求:
实现思路
- 一次性读取csv2,将
Project Owner与Project Name映射为字典,后续匹配直接查字典,避免反复读文件 - 读取csv1每一行,检查
Owner是否在字典中 - 匹配成功的行,将
Project Name插入第二列后保留;匹配失败的行直接跳过(即删除) - 结果写入新文件(不直接修改原文件,避免操作失误丢失数据)
完整代码
import csv import os # 定义文件路径,替换为你的实际文件名 desktop_path = f'/Users/{os.getlogin()}/Desktop' main_file = f'{desktop_path}/csv1.csv' projects_file = f'{desktop_path}/csv2.csv' output_file = f'{desktop_path}/processed_csv1.csv' # 第一步:加载csv2的所有者-项目名映射 owner_project_map = {} with open(projects_file, mode='r', newline='', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: # 去除首尾空格,避免因空格导致匹配失败 owner = row['Project Owner'].strip() project_name = row['Project Name'].strip() owner_project_map[owner] = project_name # 第二步:处理csv1,保留匹配行并插入项目名 with open(main_file, mode='r', newline='', encoding='utf-8') as infile, \ open(output_file, mode='w', newline='', encoding='utf-8') as outfile: reader = csv.DictReader(infile) # 构造新表头:在原表头第二位置插入Project Name new_fieldnames = reader.fieldnames[:1] + ['Project Name'] + reader.fieldnames[1:] writer = csv.DictWriter(outfile, fieldnames=new_fieldnames) writer.writeheader() for row in reader: owner = row['Owner'].strip() if owner in owner_project_map: row['Project Name'] = owner_project_map[owner] writer.writerow(row) # 不匹配的行直接跳过,等同于删除
细节补充
- 加
.strip()是为了避免单元格首尾空格导致的匹配失效,比如"张三 "和"张三"会被误判为不匹配 - 若csv2存在同一所有者对应多个项目的情况,可将字典值改为列表存储多个项目名,再根据需求拼接处理
- 处理完成后,确认新文件数据无误再替换原文件,降低数据风险
内容的提问来源于stack exchange,提问作者valor
相关产品推荐
相关产品推荐

