多分店CSV销售流水合并:同订单号自动相加、GBK编码自动识别

2026-10-05 · 本文所有代码均在真实测试数据上跑通后发布

连锁店/多渠道做账常见痛点:每家分店导出一份 .csv,订单号经常跨表重复(补录、退单重开),编码还不统一(有的系统导 GBK)。手工在 Excel 里 VLOOKUP 合并,一个不留神就把同一单算两遍或漏一遍。本文给一段 Python 脚本,按订单号自动合并金额。

测试数据(真实跑过)

脚本

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,账是平的。

实跑抓到的三个坑(都是真踩的)

  1. GBK 不处理直接 UnicodeDecodeError 全盘崩。国内很多 ERP/收银系统导出就是 GBK,先试 utf-8-sig 再回退 gbk,两种都能兜住(utf-8-sig 顺便解决 Excel 导出带 BOM 的问题)。
  2. 表头不符必须报错并打印文件名。如果静默跳过,你根本不知道少合并了哪家店——这次测试里"表头错.csv"就是靠报错才被看见的。宁可中断让人看一眼,也别默默丢一整个店的数据。
  3. 金额必须 float() 强转。CSV 里全是字符串,直接 + 会把 "80" + "80" 拼成 "8080" 而不是 160。有千分位逗号(如 "1,200")的要先 replace(",", "")。

如果订单号和金额在不同列位置,把 r[0]、r[1] 换成按表头找列下标即可,逻辑不变。

📄 表格/数据整理类工作不想自己折腾?喵窝提供 ¥19.9 表格处理代做:把文件发过来,脚本代跑、结果核对后交付。

→ 去下单页看看 | 免费工具清单(每日更新)

虚拟物品交付后不退款;未收到或未达承诺免费补发/重做。