打卡记录一人一天好几条?按关键列「留最新一条」的 10 行脚本

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 条,每人每天只剩最新记录,正确。

三个容易踩的坑(都是真踩过的)

如果重复规则更复杂(按时间列取最晚、多条件去重、还要标红被删的行),这种一分钟说清楚,我们直接给你写好测好。
懒得自己改?找我们代写
喵窝资源铺提供 Python 脚本代写服务:你说清楚表格长什么样、要去重规则是什么,我们写好脚本、用你的真实数据测试通过再交付,24 小时内出活。AI 服务,明码标价,先看效果再付款(虚拟物品不退款,不满意免费重做)。
👉 了解代写服务 | 联系我们

相关阅读:合并后按关键列去重留最新(进阶版) | 多 CSV 合并去重 | 按列分组汇总计数/求和 | 按行求和算每人合计