正确做法是用 glob 或 pathlib 批量获取 Excel 路径,统一 dtype 读取后存入列表,再用 pd.concat(..., ignore_index=True, join="outer", sort_keys=False) 一次性合并,并过滤空表、校验字段名。

用 pandas.concat() 合并多个 Excel 文件,别直接 pd.read_excel() 循环加 .append()
老写法是读一个、存一个 DataFrame、再 .append() 到总表里——这在新版本 pandas 里会报 FutureWarning: The frame.append method is deprecated,而且性能差:每 append 一次都复制整个 DataFrame。正确路径是先用列表收集所有 pd.read_excel() 的结果,再一次性 pd.concat()。
- 用
glob.glob("data/*.xlsx")或pathlib.Path("data").glob("*.xlsx")批量获取文件路径,别手动列文件名 - 读取时统一指定
dtype(比如{"ID": str, "金额": float}),避免同一列在不同表里被推断成不同类型,后续concat时报ValueError: All objects passed were None或隐式转换出错 - 加
ignore_index=True参数,否则合并后索引重复(0,1,2… 在每个表里都出现),影响去重或定位
合并时字段不一致?用 pd.concat(..., join="outer") 和 sort_keys=False
不同 Excel 表的列名可能有增减:A 表有 "客户名称" 和 "地区",B 表漏了 "地区"。默认 join="outer" 是对的,它会补 NaN;但如果你发现合并后列顺序乱了(比如 B 表的 "订单号" 跑到最右边),那是 pandas 默认按字母序重排列名。加 sort_keys=False 就能保持第一个表的列顺序为基准。
- 如果想强制所有表字段对齐,提前用
usecols参数限定读取列,例如pd.read_excel(f, usecols=["订单号", "客户名称", "金额"]) - 留意空表:某个 Excel 是空工作表,
pd.read_excel()返回空DataFrame,concat会保留它,导致最终结果多出一整行NaN;加个if not df.empty:过滤掉 - 工作表名不是
"Sheet1"?用sheet_name=0读第一个表,或传字符串指定,别依赖默认值
openpyxl 报 InvalidFileException?换引擎或预检查文件头
读 .xlsx 时突然报 openpyxl.utils.exceptions.InvalidFileException: File is not a zip file,大概率是文件实际是 .xls(Excel 97–2003 格式)却被当 .xlsx 处理,或者文件损坏/未完全下载。pandas 默认用 openpyxl 读 .xlsx,用 xlrd 读 .xls(但 xlrd>=2.0 已不支持 .xlsx)。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 统一用
engine="openpyxl"显式指定,避免 pandas 自动猜错;读 .xls 改用engine="xlrd"(需装xlrd)或转存为 .xlsx - 简单判断文件真实类型:用
python-magic或读前 4 字节——b"PK\x03\x04"才是 zip(即合法 .xlsx);否则跳过或报错提示 - Windows 下路径含中文,
pd.read_excel()可能因编码问题卡住,优先用pathlib.Path构造路径,比拼接字符串更稳
写入合并结果时,index=False 是底线,别让行号变成第一列
用 df.to_excel("汇总.xlsx", index=False) 是基本操作,但容易漏——一旦忘了 index=False,pandas 会把自动索引(0,1,2…)当真实数据写进第一列,后续别人打开 Excel 就得手动删,还可能误参与计算。
立即学习“Python免费学习笔记(深入)”;
- 如果要保留原始各表来源信息,合并前给每个
DataFrame加一列:df["来源文件"] = f.name,别等写完再想怎么溯源 - 大文件(>10 万行)直接
to_excel可能内存爆掉,改用ExcelWriter分块写,或导出为.csv(用df.to_csv(),更快更省内存) - 注意
to_excel不支持直接追加写入已有 Excel 的 sheet,想增量更新得用openpyxl加载原文件再操作——那已超出pandas单一职责范围了
字段名带空格或特殊符号(如 "销售日期 " 末尾有空格)、不同表大小写不一致("ID" vs "id"),这些细节不会报错,但会让合并后数据对不上。自动化脚本里必须加校验,不能只靠肉眼核对。

















