目标
合并导出包含数百万重复行,又无法一次性全部载入内存。本配方流式读取文件,对自然键做哈希并存入集合,只写出每个键的首次出现,从而以「唯一键数量」而非「总行数」的内存完成去重;提醒哈希需足够强、内存超出时按哈希前缀分片。
步骤要点
- 流式读取并对自然键做哈希存入集合。
- 只写出每个键的首次出现。
- 用强哈希并以不易冲突的分隔符拼接键字段。
- 比较输入输出行数报告去重数量。
import csv, hashlib, sys
seen = set()
with open('in.csv', newline='') as fin, open('out.csv', 'w', newline='') as fout:
reader = csv.reader(fin)
writer = csv.writer(fout)
header = next(reader); writer.writerow(header)
for row in reader:
key = hashlib.sha1('\x1f'.join(row[:4]).encode()).digest()
if key in seen: continue
seen.add(key); writer.writerow(row)
排错提示
- 哈希碰撞需用强哈希与唯一分隔符。
- 唯一键超出内存时需分片或落盘。
- 键字段大小写不一致会影响去重。
适用边界
- 内存与唯一键数量成正比。
- 单遍处理不做跨文件对账。