用 pandas.concat 合并多个 excel 文件前,须统一读取格式:显式指定 header=0、dtype=str(或按列设类型),对合并单元格用 fillna(method='ffill');用 glob 精准匹配文件;concat 时必设 ignore_index=true;导出大文件用 engine="xlsxwriter";日期列需 parse_dates 强制转换或全读为 str 统一处理。

用 pandas.concat 合并多个 Excel 文件前,先统一读取格式
直接 pd.concat 多个 pd.read_excel() 结果常出错,不是列名对不齐,就是某张表有合并单元格或空行。关键不是“怎么拼”,而是“怎么让每张表读出来结构一致”。
- 务必显式传入
header=0(哪怕第一行是标题),避免某些文件因空行导致自动跳过 - 加
dtype=str或按列指定类型,防止数字列被误读成float64(比如工号“00123”变成123.0) - 遇到合并单元格,
read_excel默认会填充NaN,但后续concat时可能引发类型冲突,建议提前用fillna(method='ffill')处理
遍历文件夹时,glob 比 os.listdir 更稳
os.listdir 返回所有文件,包括隐藏文件、临时文件(如 ~$report.xlsx),一不小心就触发 xlrd 或 openpyxl 解析失败。而 glob 可精准匹配后缀,还能自然跳过非 Excel 文件。
- 用
glob.glob("data/*.xlsx"),别用os.listdir("data")+ 字符串判断 - Windows 下路径分隔符不用手动处理,
glob自动适配 - 如果文件名含中文或空格,
glob也比pathlib.Path().iterdir()少一层编码风险(尤其 Python 3.8 以前)
concat 时必须设 ignore_index=True,否则索引重复报错
每张 Excel 读进来默认索引是 0, 1, 2...,直接 concat 会保留原始索引,结果 DataFrame 出现大量重复索引值。后续用 .loc 或导出时容易出问题,且 drop_duplicates 不生效。
- 永远加
ignore_index=True,让新 DataFrame 索引从 0 连续重排 - 别依赖
sort_index()补救——它不解决底层索引重复,只影响显示顺序 - 如果真需要保留来源标识,改用
keys参数:pd.concat(dfs, keys=file_names, ignore_index=False),但要注意返回的是MultiIndex
合并后导出大文件,openpyxl 会卡死,换 xlsxwriter
超过 5 万行或带样式的 Excel 合并后,用默认引擎(openpyxl)写入经常卡住、内存暴涨甚至崩溃。这不是数据问题,是引擎本身对“纯数据写入”优化不足。
- 导出时显式指定引擎:
df.to_excel("merged.xlsx", engine="xlsxwriter") -
xlsxwriter不支持读取,只用于写,所以只在最后一步用 - 如果原表有复杂样式或图表,别强求合并——Excel 本质不是数据库,样式和数据该分开管
2023-05-01 在不同 Windows 区域下,read_excel 可能解析成 datetime 或 str,进而导致 concat 时某列类型为 object,后续无法做时间运算。处理办法只有两个:要么统一用 parse_dates 强制转,要么全读成 str 再统一处理。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











