
本文介绍如何利用 python 的 glob 模块自动匹配多级目录(如按年/月组织)下的所有 parquet 文件,批量读取、合并为单个 pandas dataframe,避免硬编码路径或手动循环年月参数。
本文介绍如何利用 python 的 glob 模块自动匹配多级目录(如按年/月组织)下的所有 parquet 文件,批量读取、合并为单个 pandas dataframe,避免硬编码路径或手动循环年月参数。
在实际数据分析流程中,数据常按时间维度(如 202301、202302)分目录存储,每个子目录下包含结构一致的 Parquet 文件(如 data01.pqt)。若需统一加载并按 ID 合并所有数据,手动拼接路径或逐月循环不仅冗余,还易出错且难以维护。
推荐方案是使用标准库 glob 进行通配符路径匹配,再结合 pandas.concat() 高效聚合。以下为完整实现:
import pandas as pd
from glob import glob
# 使用通配符匹配所有符合条件的 .pqt 文件
# 注意:Windows 路径需用原始字符串(r"")或双反斜杠,且 glob 支持 ** 递归(Python 3.5+)
files = glob(r"\Users\Documents\20*\data*.pqt") # 匹配 20 开头的年份目录及 data*.pqt 文件
# 批量读取并合并(假设所有文件均有 'ID' 列,且需保留全部行)
dfs = []
for file in files:
try:
df = pd.read_parquet(file)
# 可选:添加来源标识便于调试
df['source_file'] = file.split('\')[-2:] # 记录 [年月目录, 文件名]
dfs.append(df)
except Exception as e:
print(f"跳过文件 {file},读取失败:{e}")
# 按 ID 合并(outer join 保留所有 ID;若需 inner 或其他逻辑,可指定 join='inner')
if dfs:
merged_df = pd.concat(dfs, ignore_index=True, sort=False)
# 若需去重或按 ID 聚合,可在此后操作,例如:
# merged_df = merged_df.groupby('ID').first().reset_index() # 取每 ID 首条记录
else:
merged_df = pd.DataFrame()
print(f"成功合并 {len(files)} 个文件,总计 {len(merged_df)} 行记录")
关键注意事项:
- ✅ glob 支持 *(单层通配)和 **(递归多层),但 Windows 下需确保路径格式正确(建议统一用 \ 或 /);
- ✅ pd.read_parquet() 对 Parquet 文件效率极高,无需解压或解析文本;
- ⚠️ 确保所有 Parquet 文件 schema 一致(尤其 ID 列类型相同),否则 concat 可能报错或隐式转换;
- ⚠️ 大量文件时,可考虑添加 chunksize 或内存监控,避免 OOM;
- ? 如需精确控制年月范围(如仅 2023–2024 年),可用 pathlib 构造路径 + strftime 动态生成,但 glob 更简洁通用。
此方法将路径管理从“手动枚举”升级为“模式匹配”,大幅提升可扩展性与可维护性——新增月份目录后,代码零修改即可自动纳入处理流程。











