用glob批量读取excel文件最稳妥,需用原始字符串处理路径、ignore_index=true合并、标准化列名、分块读取转csv防内存溢出,并显式解析时间列。

用 glob 批量读取 Excel 文件最稳妥
直接硬写几百个 pd.read_excel("file1.xlsx") 不现实,也容易漏文件。用 glob 是最轻量、最可控的方式——它不依赖操作系统命令,跨平台稳定,且能精准匹配文件名模式。
常见错误是路径里混用反斜杠 \ 或没处理空格/中文路径,导致 FileNotFoundError。务必用原始字符串或正斜杠:
-
import glob后用glob.glob(r"data/*.xlsx")(Windows)或glob.glob("data/*.xlsx")(macOS/Linux) - 避免用
os.listdir()+ 手动过滤,它不保证顺序,也不支持通配符 - 如果文件分散在子目录,加
recursive=True和**/*.xlsx,但注意性能下降明显
pd.concat() 合并时必须设 ignore_index=True
不设这个参数,合并后的 DataFrame 会保留每个文件的原始行索引(全是 0,1,2…重复),后续按行号切片或去重会出错;设了之后才得到连续、可信赖的整数索引。
另一个关键点是列对齐:不同 Excel 文件列名可能大小写不一致(如 "Date" vs "date")或有额外空列。建议提前统一:
- 读取时加
pd.read_excel(..., usecols="A:C")显式指定列范围,跳过格式混乱的表头行 - 或统一用
header=0读取后,用df.columns = df.columns.str.strip().str.lower()标准化列名 - 若某文件缺列,
pd.concat()默认用NaN填充,无需额外处理
内存撑不住时,改用分块读取 + 追加写入 CSV
一次性读几百个 Excel 文件很容易触发 MemoryError,尤其当单个文件超 10MB 或含大量公式/样式。Excel 解析本身比 CSV 慢 5–10 倍,且 openpyxl 引擎吃内存更狠。
真正落地的方案不是“优化读取”,而是绕开 Excel 解析:
- 先用
glob列出所有文件,循环中逐个用pd.read_excel()读一小批(比如 20 个),pd.concat()后立刻to_csv("merged_temp.csv", mode="a", header=False if i>0 else True) - 最终用
pd.read_csv("merged_temp.csv")一次性加载——CSV 解析快、省内存、无样式干扰 - 别用
to_excel()输出大合并结果,.xlsx 文件体积会暴增,且再次打开极慢;用to_parquet()更好,但需确保环境装了pyarrow
时间列解析失败?检查 parse_dates 和 date_parser
Excel 里的时间常以“常规格式”存储为浮点数(如 44562.75 表示日期+时间),pd.read_excel() 默认无法识别,导致列变成 object 类型,后续 dt 方法全报错。
必须显式干预:
- 优先用
parse_dates=["OrderDate"]参数,让 Pandas 在读取阶段就尝试解析 - 如果失败(比如 Excel 里混用了文本型日期如
"2023-01-01"和数字型),加date_parser=lambda x: pd.to_datetime(x, errors="coerce") - 绝对不要等合并完再统一转:
df["date"].apply(pd.to_datetime)——这会遍历全部百万行,慢到卡死
实际跑通的关键往往不在“怎么合并”,而在于提前发现并拦截每个文件的异构性:列名不一致、空行位置不同、时间格式混杂、编码乱码。自动化不是写完脚本就完事,而是把第一次运行时暴露的 5 个异常文件单独拎出来,针对性加 skiprows、dtype 或 converters 参数,再补进主流程。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











