2026-10-01 · 喵窝资源铺
月底对账是很多人最烦的杂活:我方系统一份流水,微信/支付宝/银行一份流水,格式不一样、订单号字段名不一样,还有人手抖重复入账。肉眼用 VLOOKUP 对几百行,一下午就没了还容易漏。
这篇给一个 30 行、可直接运行 的对账脚本,本文代码在 pandas 3.0.6 下实跑验证,输出如下文所示。
两份文件支持 Excel(.xlsx) 和 CSV,各自指定"单号列"和"金额列",不用改数据源格式:
"""对账脚本:两份流水 Excel(或CSV)按订单号对齐,自动找出差异。
用法:python reconcile.py 我方.csv 订单号 金额 对方.xlsx 交易编号 入账金额
"""
import sys
import pandas as pd
def load(path, id_col, amt_col):
df = pd.read_csv(path) if path.lower().endswith(".csv") else pd.read_excel(path)
df = df[[id_col, amt_col]].copy()
df.columns = ["id", "amount"]
df["id"] = df["id"].astype(str).str.strip()
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")
return df.dropna()
def main(my_file, my_id, my_amt, their_file, their_id, their_amt):
mine = load(my_file, my_id, my_amt).rename(columns={"amount": "mine"})
theirs = load(their_file, their_id, their_amt).rename(columns={"amount": "theirs"})
m = pd.concat([mine.groupby("id").sum(), theirs.groupby("id").sum()]).groupby(level=0).sum(min_count=1)
out = m.fillna(0)
out["diff"] = (out["mine"].fillna(0) - out["theirs"].fillna(0)).round(2)
only_mine = m.index[m["theirs"].isna()]
only_theirs = m.index[m["mine"].isna()]
mismatched = out[(out["diff"] != 0) & ~out.index.isin(only_mine) & ~out.index.isin(only_theirs)]
print(f"我方独有 {len(only_mine)} 笔:", list(only_mine)[:10])
print(f"对方独有 {len(only_theirs)} 笔:", list(only_theirs)[:10])
print(f"金额不一致 {len(mismatched)} 笔:")
print(mismatched.to_string() if len(mismatched) else "(无)")
out.reset_index().to_excel("对账结果.xlsx", index=False)
print("明细已写 对账结果.xlsx")
if __name__ == "__main__":
main(*sys.argv[1:7])
构造一份测试数据:我方 4 笔;对方 5 条记录,其中 A2 被重复入账了两次(199.5 + 200.5),另有对方独有的 A5。跑:
python reconcile.py 我方.csv 订单号 金额 对方.csv 交易编号 入账金额
输出(真实运行结果):
我方独有 1 笔: ['A4']
对方独有 1 笔: ['A5']
金额不一致 1 笔:
mine theirs diff
A2 200.5 400.0 -199.5
明细已写 对账结果.xlsx
三行就点出全部问题:A4 只在我方、A5 只在对方、A2 对方合计 400 对不上(点开对账结果.xlsx 就能看到是重复入账)。
str.strip() 专门处理这个,别省。pd.to_numeric(errors="coerce") 把"¥100.00"、"1,000"这类脏值转成数字或空值,避免整列变字符串后求和出错。如果你的金额带千分位逗号,先 df["amount"] = df["amount"].astype(str).str.replace(",", "")。这个脚本适合"两边都能按唯一单号对齐"的场景。如果你遇到的是:两边单号规则不同(需要模糊匹配)、按日期+金额对齐、或者几百个 sheet 批量跑——那是另一个量级的活,可以找我们代写(见下)。
相关阅读:多个 Excel 表怎么合并?4 种方法 · 800 个乱文件自动整理