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

Python:提取两CSV差异数据并保留指定列写入新CSV

我之前处理过几乎一模一样的需求,其实核心就是先快速匹配两个CSV的唯一标识(比如你说的ID),然后筛选出父CSV里独有的记录,同时精准保留你需要的address列。下面给你一个实用的Python实现方案,比你之前参考的旧方法更灵活:

核心思路

  • 先读取子集CSV,把所有存在的ID存入一个集合(集合的查找效率远高于列表,数据量大时优势明显)
  • 遍历父CSV的每一行,检查当前行的ID是否不在子集CSV的ID集合中
  • 对符合条件的行,只提取你需要的ID和address列,写入新CSV

完整代码实现

import csv

# 替换成你的实际文件路径
parent_csv = "parent.csv"
subset_csv = "subset.csv"
output_csv = "missing_with_address.csv"

# 第一步:提取子集CSV中的所有ID,存入集合
existing_ids = set()
with open(subset_csv, mode="r", newline="", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    # 这里假设ID列的名称是"id",如果你的列名是其他(比如"user_id"),直接替换即可
    for row in reader:
        existing_ids.add(row["id"])

# 第二步:筛选父CSV中不在子集的记录,并保留address列
with open(parent_csv, mode="r", newline="", encoding="utf-8") as parent_f, \
     open(output_csv, mode="w", newline="", encoding="utf-8") as output_f:
    
    parent_reader = csv.DictReader(parent_f)
    # 定义输出CSV的表头,你可以根据需要添加其他列
    output_fields = ["id", "address"]
    writer = csv.DictWriter(output_f, fieldnames=output_fields)
    
    writer.writeheader()  # 写入表头
    
    for row in parent_reader:
        if row["id"] not in existing_ids:
            # 只写入需要的列,避免多余数据
            writer.writerow({
                "id": row["id"],
                "address": row["address"]
            })

print(f"处理完成!结果已保存到 {output_csv}")

关键注意事项

  1. 列名匹配:确保代码中row["id"]和row["address"]的列名和你的CSV实际列名完全一致(大小写敏感)
  2. 编码问题:如果你的CSV有中文或特殊字符,encoding="utf-8"能避免乱码;如果是Windows生成的CSV,可能需要用encoding="gbk"
  3. 性能优化:用集合存储ID是因为in操作的时间复杂度是O(1),如果用列表存储,数据量大时会慢很多
  4. 扩展灵活:如果需要保留更多列,只需要修改output_fields列表,比如["id", "address", "phone", "email"],然后在writerow中对应添加即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:33:15