如何从Azure存储批量读取通配符匹配JSON文件至Python DataFrame
Azure Blob 通配符读取多文件合并DataFrame实现方案
Azure Blob Storage 官方Python SDK原生不支持直接传入*类shell通配符读取文件,你可以通过「前缀拉取候选Blob + 通配规则过滤」的方式实现完全等价的递归匹配读取效果,具体实现如下:
实现逻辑
- 先从通配路径中提取固定路径前缀,调用SDK的
list_blobs方法只拉取该前缀下的所有Blob,避免全容器遍历带来的性能损耗 - 借助Python标准库
fnmatch实现文件名的通配符规则匹配,筛选出符合命名规则的文件,自动递归覆盖前缀路径下所有子目录的匹配文件 - 逐个读取筛选后的JSON文件转为DataFrame,最终合并为单个DataFrame即可
完整代码
from azure.storage.blob import BlobServiceClient import json import pandas as pd import fnmatch import os # 基础配置 container_name = "test" constr = "" # 你需要的通配符路径规则 wildcard_path = "raw/filename*.json" # 拆分路径前缀和文件名匹配规则,缩小遍历范围 path_prefix = os.path.dirname(wildcard_path) + "/" file_match_rule = os.path.basename(wildcard_path) # 初始化Blob客户端 blob_service_client = BlobServiceClient.from_connection_string(constr) container_client = blob_service_client.get_container_client(container_name) df_collector = [] # 遍历指定前缀下的所有Blob(自动递归子目录) for blob in container_client.list_blobs(name_starts_with=path_prefix): # 跳过目录占位Blob,匹配文件名规则 if not blob.name.endswith("/") and fnmatch.fnmatch(os.path.basename(blob.name), file_match_rule): blob_client = container_client.get_blob_client(blob) download_stream = blob_client.download_blob() json_data = json.loads(download_stream.readall()) df_collector.append(pd.DataFrame(json_data)) # 合并所有文件的DataFrame merged_df = pd.concat(df_collector, ignore_index=True) # 原有筛选逻辑 rslt_df = merged_df[merged_df['ID'] == 'f2a8141f-f1c1-42c3-bb57-910052b78110'] rslt_df.head()
优化提示
- 如果你的JSON文件是JSON Lines格式(每行一个独立JSON对象),可以直接用
pd.read_json(download_stream, lines=True)读取,比手动load后转DataFrame性能更高 - 文件量较大时建议增加异常捕获逻辑,避免单个文件格式错误导致整个读取流程中断
- 原代码中存在重复导入、冗余导入的问题(重复导入json、导入了未使用的uuid/datetime等模块),上述代码已经做了精简
内容的提问来源于stack exchange,提问作者SanjanaSanju
相关产品推荐
相关产品推荐

