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}")
关键注意事项
- 列名匹配:确保代码中
row["id"]和row["address"]的列名和你的CSV实际列名完全一致(大小写敏感) - 编码问题:如果你的CSV有中文或特殊字符,
encoding="utf-8"能避免乱码;如果是Windows生成的CSV,可能需要用encoding="gbk" - 性能优化:用集合存储ID是因为
in操作的时间复杂度是O(1),如果用列表存储,数据量大时会慢很多 - 扩展灵活:如果需要保留更多列,只需要修改
output_fields列表,比如["id", "address", "phone", "email"],然后在writerow中对应添加即可
内容的提问来源于stack exchange,提问作者Athan Roniou
相关产品推荐
相关产品推荐

