
本文介绍如何利用 python 的 glob 模块自动匹配、批量读取并合并分散在不同年月子目录下的 parquet 文件,避免硬编码路径,实现高效、可扩展的数据整合流程。
本文介绍如何利用 python 的 glob 模块自动匹配、批量读取并合并分散在不同年月子目录下的 parquet 文件,避免硬编码路径,实现高效、可扩展的数据整合流程。
在实际数据分析工作中,常需从按时间组织的目录结构(如 \Users\Documents\202301\data01.pqt)中批量加载 Parquet 文件,并基于公共字段(如 ID)进行合并。手动逐个指定路径不仅低效,还难以维护。推荐采用 glob 模块结合 pandas 实现自动化处理。
✅ 推荐方案:glob + pandas 批量读取与合并
glob 支持通配符匹配,能灵活覆盖年月动态路径。注意路径分隔符需转义(Windows 下建议使用原始字符串 r"" 或双反斜杠 ),并确保路径模式准确覆盖目标文件:
import pandas as pd
from glob import glob
# 匹配所有形如 "\Users\Documents\{任意子目录}\*.pqt" 的文件
pattern = r"\Users\Documents\*\*.pqt"
files = glob(pattern)
if not files:
raise FileNotFoundError(f"No Parquet files found matching pattern: {pattern}")
# 逐个读取并存储为 DataFrame 列表
dfs = []
for file in files:
try:
df = pd.read_parquet(file)
# 可选:添加来源信息便于调试
df['source_file'] = file.split('\')[-2] # 提取年月目录名(如 '202301')
dfs.append(df)
except Exception as e:
print(f"Warning: Failed to read {file} — {e}")
continue
# 基于 ID 合并所有 DataFrame(使用 outer join 保留全部记录)
if dfs:
merged_df = pd.concat(dfs, ignore_index=True, sort=False)
# 若需按 ID 去重或聚合,可在此后操作,例如:
# merged_df = merged_df.groupby('ID').first().reset_index()
print(f"Successfully loaded and merged {len(dfs)} files into a DataFrame with {len(merged_df)} rows.")
else:
print("No valid DataFrames loaded.")
⚠️ 注意事项与最佳实践
- 路径兼容性:glob 在 Windows 上对反斜杠敏感,务必使用原始字符串(r"...")或统一用正斜杠 /(pandas.read_parquet 支持跨平台路径);
- 性能优化:若文件数量庞大,可考虑使用 dask.dataframe 或 pyarrow.dataset 进行延迟加载与并行读取;
- Schema 一致性:确保所有 Parquet 文件具有兼容的列结构(尤其 ID 字段类型一致),否则 concat 可能报错或隐式转换;
- 内存管理:避免一次性将超大数据集全载入内存;可先采样验证,再分批处理或使用 chunksize(Parquet 本身不支持 chunk 读取,但可通过 filters 参数筛选分区);
- 错误处理:示例中已加入 try-except,生产环境建议记录日志而非仅打印警告。
通过该方法,新增年月目录时无需修改代码——只要符合既定路径模式,即可自动纳入处理流程,真正实现“一次编写,长期复用”的自动化数据集成。











