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

Python基于唯一列对比CSV提取差异行的问题求助

基于User ID提取CSV独有行的正确实现方法

核心逻辑

  • 先从file1.csv中提取所有唯一的User ID(第二列),存入集合(集合的查询效率远高于列表,适合大规模数据)
  • 遍历file2.csv的每一行,检查该行的User ID是否不在file1.csv的ID集合中
  • 将符合条件的行写入输出文件file2-nodups.csv

可运行代码

import csv

# 读取file1的所有User ID(第二列,索引从0开始计数)
file1_ids = set()
with open('file1.csv', 'r', newline='', encoding='utf-8') as f1:
    reader = csv.reader(f1)
    # 跳过表头(如果你的CSV没有表头,删除这一行)
    next(reader)
    for row in reader:
        # 确保行有至少2列,避免索引错误
        if len(row) >= 2:
            # 去除ID前后的空格/特殊字符,避免对比失效
            clean_id = row[1].strip()
            file1_ids.add(clean_id)

# 筛选file2中独有的行并输出
with open('file2.csv', 'r', newline='', encoding='utf-8') as f2, \
     open('file2-nodups.csv', 'w', newline='', encoding='utf-8') as out_file:
    reader = csv.reader(f2)
    writer = csv.writer(out_file)
    # 写入表头(无表头则删除这一行)
    header = next(reader)
    writer.writerow(header)
    for row in reader:
        if len(row) >= 2:
            clean_id = row[1].strip()
            if clean_id not in file1_ids:
                writer.writerow(row)

关键细节说明

  • 编码统一:指定encoding='utf-8',避免因编码差异导致的乱码(如果你的文件是GBK等其他编码,替换为对应值)
  • 清洗ID:用strip()去除User ID前后的空格、换行符等,解决因隐形字符导致的对比不匹配
  • 异常防护:加入len(row)>=2的判断,防止空行或列数不足引发索引错误
  • 表头处理:如果CSV没有表头,删除两处next(reader)和表头写入的代码

排查之前代码无输出的常见原因

  • 未跳过表头,把表头的内容误加入ID集合,导致正常数据被错误过滤
  • 没有清洗ID的隐形字符,导致看似相同的ID实际不匹配
  • 文件编码不统一,读取时ID出现乱码,无法正确对比

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:07:52