2026-10-03 · 喵窝资源铺
和「按列分组汇总」(上一篇)正好相反的另一种高频需求:对每一行求和。典型场景:考勤表有「姓名 + 周一到周五每天工时」,要算每人一周总工时;业绩表有「姓名 + 各产品销售额」,要算每人总业绩。Excel 里要么一列列加、要么写数组公式,人员一多就乱。这篇给一个 8 行、零依赖 的脚本:自动跳过非数字列,对每行求和,按合计降序输出排行榜。本文代码实跑验证。
存为 row_sum.py,用法:python row_sum.py 考勤表.csv。第一列自动当名字,其余能转成数字的列全加起来:
"""对 CSV 每行求和(跳过非数字列),按合计降序输出。
用法:python row_sum.py 文件.csv"""
import sys, csv
rows_out = []
with open(sys.argv[1], newline="", encoding="utf-8-sig") as f:
reader = csv.reader(f)
header = next(reader) # 跳过表头
for r in reader:
name, nums = r[0], r[1:]
total = sum(float(x.replace(",", "")) for x in nums if x.strip())
rows_out.append((name, total))
for name, total in sorted(rows_out, key=lambda t: -t[1]):
print(f"{name},{total:g}")
print(f"-- 共 {len(rows_out)} 人,已按合计降序", file=sys.stderr)
思路:第一列当名字,其余列凡是 strip() 之后能转成数字的都加起来;全部行收进列表后一次性按合计降序输出——排行榜直接就是 stdout。统计行走 stderr,重定向不会污染结果文件。
造了 2 人 6 天考勤数据跑 python row_sum.py 考勤.csv:
张三,11 李四,7 -- 共 2 人,已按合计降序
核对:张三 3+2+1+5+0+0=11 正确,李四 5+0+2=7 正确,降序正确。结果直接就是排行榜,重定向 > 周报.csv 就能贴进汇报邮件。
.replace(",", "") 先处理千分位;带字母单位的需要再加一行正则提取数字,别硬 int()——会直接崩。next(reader) 显式跳过表头;如果你的表没有表头,把这行删掉即可。顺便提醒:中文 CSV 记得 encoding="utf-8-sig" 吃掉 Excel 的隐形 BOM。count_by.py;按行求和(每人总工时)用这篇的 row_sum.py。拿错脚本方向,统计结果完全对不上,还以为是自己数据有问题。一行一个人、要按周/月分档、还要出占比——这种需求一分钟说清楚,我们直接给你写好测好。
相关阅读:按列分组汇总计数/求和 | 合并后按关键列去重留最新 | 两份流水账自动对账 | 多 CSV 合并去重