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

CSV文件交叉匹配、数据更新及不匹配行处理方案咨询

优化方案及删除不匹配行的实现

先点明你现有代码的几个核心问题:

  • 遍历csv1每一行都重复读取csv2,数据量大时效率极低
  • 写入文件用了r只读模式,根本无法写入,逻辑完全错误
  • 没有保留csv1原有列数据,直接写入固定两列,会丢失原始信息

以下是更高效的实现,同时完成匹配时将Project Name插入第二列、不匹配行直接丢弃的需求:

实现思路

  1. 一次性读取csv2,将Project Owner与Project Name映射为字典,后续匹配直接查字典,避免反复读文件
  2. 读取csv1每一行,检查Owner是否在字典中
  3. 匹配成功的行,将Project Name插入第二列后保留;匹配失败的行直接跳过(即删除)
  4. 结果写入新文件(不直接修改原文件,避免操作失误丢失数据)

完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:15:28