glob路径错误致空列表、dtype未设致前导零丢失、concat未ignore_index致索引重复、大文件全量加载致内存溢出是excel批量读取四大陷阱。

用 glob 批量读取 Excel 文件时路径写错会静默失败
常见现象是 glob.glob("*.xlsx") 返回空列表,但程序不报错,后续 pd.concat 直接崩溃或合并出空 DataFrame。根本原因在于当前工作目录不是 Excel 文件所在目录。
实操建议:
- 显式指定绝对路径或使用
os.chdir()切换到目标文件夹后再调用glob - 优先用
glob.glob("data/*.xlsx")这类相对路径,并确认data/存在且有读取权限 - 加一行检查:如果
file_list = glob.glob("*.xlsx"); print(len(file_list))输出为 0,立刻停住排查路径 - Windows 下注意反斜杠转义问题,统一用原始字符串:
r"data\*.xlsx"或正斜杠"data/*.xlsx"
pd.read_excel() 不加 dtype=str 会导致数字列自动转 int 后丢失前导零
比如“00123”变成 123,“0001”变成 1,合并后无法还原。这不是 concat 的问题,而是单个读取阶段就已失真。
实操建议:
- 统一加参数
dtype=str,强制所有列按字符串读入(适合多数报表场景) - 若需保留数值类型,改用字典精确指定列类型:
dtype={"订单号": str, "金额": float} - 避免依赖默认类型推断——Excel 单元格格式和实际内容常不一致,
read_excel的推测不可靠
pd.concat() 默认不重置索引,合并后出现重复或跳跃的行号
每个 Excel 读成一个 DataFrame,默认索引都是从 0 开始,直接 concat 会导致 index 重复(如全是 0,1,2),影响后续 .loc 查找或去重逻辑。
实操建议:
- 必须加参数
ignore_index=True,让concat生成连续新索引 - 如果需要保留原始文件来源信息,提前给每个 DataFrame 加一列:
df["source"] = filename,再 concat - 不要依赖
reset_index()补救——它只是重排 index,而ignore_index=True是 concat 内部重建,更干净
大文件合并时内存暴涨,pd.concat 卡死或 OOM
一次性把几十个 10MB 的 Excel 全读进内存再拼接,很容易触发 MemoryError。Pandas 不会自动流式处理 Excel,glob + read_excel + concat 是全量加载模式。
实操建议:
- 先用
pd.read_excel(..., nrows=1)快速探查列结构,确认 schema 一致再批量读 - 分批处理:每读 5 个文件就
concat一次并del掉原 df,及时触发 Python 垃圾回收 - 真正大批量时,放弃 Excel 直读,改用
openpyxl流式提取关键列,或先导出为 CSV 再用pd.read_csv(更快更省内存)
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











