2026-10-02 · 喵窝资源铺
又一个真实高频需求:考勤机一天打了好几次卡、两份表合并之后同一个人同一天出现多行,领导只要每人每天最新的一条。Excel 里"删除重复项"只会随机留一条,排序+筛选又容易出错。这篇给一个 10 行、零依赖 的脚本:按关键列(如 姓名+日期)做键,后出现的覆盖先出现的,天然只留最后一条。本文代码实跑验证。
存为 dedup_latest.py,用法:python dedup_latest.py 打卡.csv。默认按第 1+2 列做键,其余列原样保留:
"""按关键列去重,只留每组最后一条。
用法:python dedup_latest.py 文件.csv [键列数,默认2]"""
import sys, csv
key_n = int(sys.argv[2]) if len(sys.argv) > 2 else 2
latest = {} # 键 -> (行号, 行),后出现的覆盖先出现的
with open(sys.argv[1], newline="", encoding="utf-8-sig") as f:
reader = csv.reader(f)
header = next(reader)
for i, r in enumerate(reader):
latest[tuple(r[:key_n])] = (i, r)
for _, r in sorted(latest.values()): # 按原行号顺序输出,保持时间序
print(",".join(r))
print(f"-- 去重后剩 {len(latest)} 条", file=sys.stderr)
思路:用字典 键 → 行,同一键再出现就直接覆盖——遍历完字典里剩下的就是每组最后一条。输出按原行号排序,等于保持文件原有时间顺序。统计行走 stderr,重定向不污染结果。
造了 2 人 2 天共 6 条打卡数据(张三重复 3 条、李四重复 2 条)跑 python dedup_latest.py 打卡.csv:
姓名,日期,打卡,状态 李四,2026-10-01,09:05,正常 张三,2026-10-01,09:10,迟到 李四,2026-10-02,08:55,正常 张三,2026-10-02,09:30,补卡 -- 去重后剩 4 条
核对:张三 10-01 留的是 09:10(最新一条),10-02 留 09:30;李四各留最新。6 条 → 4 条,每人每天只剩最新记录,正确。
sorted(rows, key=...) 或 Excel 排序),否则留错。如果重复规则更复杂(按时间列取最晚、多条件去重、还要标红被删的行),这种一分钟说清楚,我们直接给你写好测好。
相关阅读:合并后按关键列去重留最新(进阶版) | 多 CSV 合并去重 | 按列分组汇总计数/求和 | 按行求和算每人合计