从Azure Blob Storage下载资源返回空结果的问题咨询
核心原因
你传入的BLOBNAME是虚拟目录路径而非单个Blob文件的完整名称。Azure Blob Storage本质是扁平存储结构,你看到的三级文件夹层级是Blob名称中携带/字符虚拟生成的,不存在实体文件夹对象。get_blob_client()方法只能指向单个具体的Blob文件,当传入虚拟目录路径时,你获取的是路径对应的空占位对象,自然下载不到实际的JSON数据。
如果之前你在Blob存储中手动创建过实体目录占位对象(也就是名称为location1/2021-07-09/07-00/的0大小Blob),就是你调用get_blob_client没有报错但下载结果为空的直接原因。
修正方案
你需要先遍历指定前缀下的所有实际Blob文件,再逐个下载,修正后代码示例如下:
import json import pandas as pd import keyring import os import time from azure.storage.blob import BlobServiceClient # 原代码缺少该导入 STORAGEACCOUNTURL= "https://<mystorageaccount>.blob.core.windows.net" STORAGEACCOUNTKEY= keyring.get_password('<name>', '<username>') # 存储下载文件的本地文件夹,自动创建不存在的目录 LOCAL_SAVE_DIR = os.path.join(os.getcwd(), 'test_blob') os.makedirs(LOCAL_SAVE_DIR, exist_ok=True) CONTAINERNAME= "edge" # 目标虚拟目录前缀 BLOB_PREFIX = 'location1/2021-07-09/07-00/' t1=time.time() blob_service_client_instance = BlobServiceClient( account_url=STORAGEACCOUNTURL, credential=STORAGEACCOUNTKEY ) # 获取容器客户端 container_client = blob_service_client_instance.get_container_client(CONTAINERNAME) # 遍历前缀下所有Blob文件 for blob in container_client.list_blobs(name_starts_with=BLOB_PREFIX): # 跳过虚拟目录占位对象(大小为0、名称以/结尾的对象) if blob.name.endswith('/') and blob.size == 0: continue # 生成本地存储路径 local_file_path = os.path.join(LOCAL_SAVE_DIR, os.path.basename(blob.name)) # 下载单个Blob blob_client = container_client.get_blob_client(blob) with open(local_file_path, "wb") as f: blob_data = blob_client.download_blob() blob_data.readinto(f) print(f"已下载文件:{blob.name}") t2=time.time() print(f"全部下载完成,共耗时{t2 - t1}秒")
如果需要合并所有JSON文件为单个文件,可以在遍历过程中读取每个Blob的内容,合并后再统一写入本地即可。
内容的提问来源于stack exchange,提问作者MichaelA
相关产品推荐
相关产品推荐

