2026-10-06 · 本文所有输出均为作者在本机真实运行结果
导出数据、爬虫落库、多次追加记录的 CSV 里,同一个 key 经常出现多行,而我们通常只要「每个 key 的最新一条」。分享一个我日常用的极简写法。
demo.csv
a,1
b,2
b,3
c,4
原理:逐行读入,用 key 列做字典的键,后读到的行直接覆盖前面的。全部读完,字典里剩下的就是每个 key 最后一次出现的行。
import csv
rows = list(csv.reader(open('demo.csv')))
seen = {}
for r in rows:
seen[r[0]] = r # 同 key 后行覆盖前行 = 保留最新
print(list(seen.values()))
实际运行输出:
[['a', '1'], ['b', '3'], ['c', '4']]
b 保留的是第 3 行(最新),正确。
import csv
rows = list(csv.reader(open('demo.csv')))
seen = set(); keep_first = []
for r in rows:
if r[0] not in seen:
seen.add(r[0]); keep_first.append(r)
print(keep_first)
实际运行输出:
[['a', '1'], ['b', '2'], ['c', '4']]
r[0].strip() 先清洗,否则 'b' 和 'b ' 会被当成两个 key。csv.reader 本身是迭代器,数据量大时直接 for r in reader 流式处理,字典里只留结果行,内存占用只跟去重后的行数有关。enumerate(rows, start=2)(第 1 行是表头),调试时很有用。python3 -c "import csv,sys; d={r[0]:r for r in csv.reader(sys.stdin)}; [print(','.join(r)) for r in d.values()]" < demo.csv