发布于 2026-10-06 · 本文所有数据均为脚本真实运行输出
收表场景天天见:班级群里发了「应到名单」,收上来一份「已交名单」,班主任/HR/活动组织者要在几百个名字里肉眼找漏网之鱼。今天这个脚本 10 秒出结果,还能直接生成未交名单文件发回群里催。
# -*- coding: utf-8 -*-
"""两份名单找差集:all.csv 应到名单 vs done.csv 实际交表,输出未交名单"""
import csv, sys
def load_names(path, col=0):
names = []
with open(path, newline='', encoding='utf-8-sig') as f:
for row in csv.reader(f):
if row and row[col].strip():
names.append(row[col].strip())
return names
def main(all_file, done_file, out_file='missing.csv'):
all_names = load_names(all_file)
done_set = set(load_names(done_file))
missing = [n for n in all_names if n not in done_set]
dup = len(all_names) - len(set(all_names))
with open(out_file, 'w', newline='', encoding='utf-8-sig') as f:
w = csv.writer(f)
w.writerow(['未完成名单'])
for n in missing:
w.writerow([n])
print(f"应到 {len(all_names)} 人(重名 {dup} 个),已交 {len(done_set & set(all_names))} 人,"
f"未交 {len(missing)} 人 → 已写入 {out_file}")
for n in missing:
print(" -", n)
if __name__ == '__main__':
main(sys.argv[1], sys.argv[2], sys.argv[3] if len(sys.argv) > 3 else 'missing.csv')
构造测试数据:应到 6 行(其中「李四」重复出现 1 次),已交 3 人(含一个不在应到名单的「孙七」):
$ python3 diff_check.py all.csv done.csv missing.csv
应到 6 人(重名 1 个),已交 3 人,未交 2 人 → 已写入 missing.csv
- 王五
- 赵六
生成的 missing.csv 用 Excel 打开不乱码,直接截图/转发催表。
utf-8 读取时第一个名字会变成 \ufeff张三,永远对不上。必须用 utf-8-sig(能同时兼容带/不带 BOM 的文件)。strip()。print(done_set - set(all_names)) 检查。load_names(path, col=1)。对比的是「姓名+工号」这种组合键?把两个单元格拼成一个字符串再比即可。把两份名单发给我们,人工核对后返还未交名单(支持 Excel/CSV/截图/微信接龙文本),19.9 元/次,24 小时内交付。
更多办公自动化实战: 博客合集(50+ 篇) · 服务清单
下单代做 →