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
相关产品推荐
相关产品推荐

