用pandas.read_excel()比对Excel需指定sheet_name和dtype=object,清理列名、统一索引与列序、填充空值,并用compare()导出带样式的差异;超大文件应分块读取,且须确保语义对齐。

用 pandas.read_excel() 读取时必须指定 sheet_name 和 dtype=object
不显式指定 sheet_name,read_excel() 默认只读第一个 sheet,如果两份报表实际在不同 sheet(比如都叫 "汇总")但没传参,会无声失败;更隐蔽的问题是数字列含空值或混合类型(如“123”和“-”混存),pandas 自动推断成 float64 后把整数转成 123.0,再跟另一份的原始字符串“123”比就永远不等。dtype=object 强制全当字符串读,避免类型错位。
- 推荐写法:
df1 = pd.read_excel("a.xlsx", sheet_name="汇总", dtype=object) - 如果列名含空格或特殊字符,后续比较前先用
df.columns = df.columns.str.strip()清理 - 读入后立刻检查
df1.shape和df2.shape是否一致,不一致说明行数/列数已不同,直接跳过逐单元格比对
用 df1.compare(df2) 前要确保索引和列顺序完全一致
compare() 是 pandas 1.1.0+ 内置方法,比手动 df1 != df2 更直观——它只返回差异部分,并带 self/other 标签。但它对齐逻辑很严格:默认按索引 + 列名双轴匹配。如果两份 Excel 行顺序不同(比如导出时间不同导致排序不一致),或列顺序人为调换过(A/B/C 列 vs A/C/B 列),compare() 会把整行标为差异,而非定位真实变更单元格。
- 安全做法:先重置索引
df1 = df1.reset_index(drop=True),再按首列(如单号、日期)排序df1.sort_values("单号", inplace=True) - 列顺序强制统一:
common_cols = list(set(df1.columns) & set(df2.columns)),然后df1 = df1[common_cols]、df2 = df2[common_cols] - 空值处理:用
df1.fillna("")和df2.fillna("")统一空值表示,否则NaN != NaN会导致误报
导出差异结果到 Excel 时别用 to_excel() 默认参数
直接 diff_df.to_excel("diff.xlsx") 会把 compare() 返回的多级列(self/other)压成一列名,且无格式区分。用户打开后根本看不出哪边改了什么。
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
- 正确导出:用
with pd.ExcelWriter("diff.xlsx", engine="openpyxl") as writer:上下文管理 - 写入时加样式:对差异单元格高亮,
diff_df.style.applymap(lambda v: "background-color: #ffe6e6" if pd.notna(v) else ""),再.to_excel(writer, ...) - 关键列冻结:如果首列是主键(如订单号),导出前加
df_diff = diff_df.rename(columns={"单号": "单号_diff"})避免和原列名冲突,方便后续筛选
遇到超大文件(>10万行)时优先用 chunksize 分块比对
内存爆掉不是报错,而是 Python 进程被系统 kill,毫无提示。pandas 读 100MB Excel 文件常吃光 2GB 内存,尤其开了 dtype=object。
立即学习“Python免费学习笔记(深入)”;
- 分块读取:
for chunk1, chunk2 in zip(pd.read_excel("a.xlsx", chunksize=5000), pd.read_excel("b.xlsx", chunksize=5000)): - 每块内用
chunk1.compare(chunk2),结果追加到列表,最后pd.concat(all_diffs) - 注意:分块前提必须是两份文件行顺序严格一致,否则块对块比会漏掉跨块差异(比如第4999行和第5001行互换)
真正难的不是代码怎么写,是确认两份报表的“结构相同”到底指什么——是列名相同,还是业务含义相同?比如一份叫“金额”,另一份叫“应付金额”,名字不同但该比;或者“状态”列,一份用“已完成”,另一份用“1”,这种得提前映射好再比。没对齐语义,工具再快也没用。

















