多分店CSV销售流水合并:同订单号自动相加、GBK编码自动识别
连锁店/多渠道做账常见痛点:每家分店导出一份 .csv,订单号经常跨表重复(补录、退单重开),编码还不统一(有的系统导 GBK)。手工在 Excel 里 VLOOKUP 合并,一个不留神就把同一单算两遍或漏一遍。本文给一段 Python 脚本,按订单号自动合并金额。
测试数据(真实跑过)
东店.csv:GBK 编码(很多国内系统默认如此),订单 A100=120、A101=80西店.csv:UTF-8,订单 A101=80(与东店重复的补录单)、A102=200坏文件.csv:内容根本不是流水表表头错.csv:表头是oid,amount,city,格式对不上
脚本
import csv, glob
def read_csv_smart(path):
for enc in ("utf-8-sig", "gbk"):
try:
with open(path, encoding=enc) as f:
return list(csv.reader(f))
except UnicodeDecodeError:
continue
raise ValueError(f"{path}: 无法识别编码")
total = {}
for path in sorted(glob.glob("*.csv")):
try:
rows = read_csv_smart(path)
except ValueError as e:
print("跳过:", e)
continue
header = rows[0]
if header != ["订单号", "金额", "城市"]:
print(f"跳过: {path} 表头异常 {header}") # 必须报出文件名,不能静默吞掉
continue
for r in rows[1:]:
oid, amt = r[0], float(r[1])
total[oid] = total.get(oid, 0) + amt # 同订单号金额相加
for k in sorted(total):
print(k, total[k])
print("合计", sum(total.values()))
实测输出(逐项核对过)
跳过: 坏文件.csv 表头异常 ['这不是', '一个', '真正的']
跳过: 表头错.csv 表头异常 ['oid', 'amount, 'city']
A100 120.0
A101 160.0
A102 200.0
合计 480.0
A101 = 80 + 80 = 160,跨表同单正确相加;合计 480 = 120+160+200,账是平的。
实跑抓到的三个坑(都是真踩的)
- GBK 不处理直接 UnicodeDecodeError 全盘崩。国内很多 ERP/收银系统导出就是 GBK,先试
utf-8-sig再回退gbk,两种都能兜住(utf-8-sig顺便解决 Excel 导出带 BOM 的问题)。 - 表头不符必须报错并打印文件名。如果静默跳过,你根本不知道少合并了哪家店——这次测试里"表头错.csv"就是靠报错才被看见的。宁可中断让人看一眼,也别默默丢一整个店的数据。
- 金额必须
float()强转。CSV 里全是字符串,直接+会把 "80" + "80" 拼成 "8080" 而不是 160。有千分位逗号(如 "1,200")的要先replace(",", "")。
如果订单号和金额在不同列位置,把 r[0]、r[1] 换成按表头找列下标即可,逻辑不变。
📄 表格/数据整理类工作不想自己折腾?喵窝提供 ¥19.9 表格处理代做:把文件发过来,脚本代跑、结果核对后交付。
虚拟物品交付后不退款;未收到或未达承诺免费补发/重做。