如何在本地适配Azure Blob文件下载函数(替代Databricks的dbutils)
解决方案
问题根源
requests仅支持HTTP/HTTPS这类标准网络协议,wasbs://是Azure Blob Storage专属协议,因此直接用requests.get访问会触发协议不支持的错误。
本地实现步骤
1. 安装Azure Blob存储SDK
先安装Python依赖包:
pip install azure-storage-blob
2. 编写本地下载函数
从给定的wasbs URI中提取容器名、存储账户名和Blob路径前缀,再通过Azure SDK的匿名客户端访问公开可读的容器(无凭证说明该容器已开启公开访问权限):
from azure.storage.blob import BlobServiceClient import os def download_dataset(wasbs_uri, local_target_dir): # 解析wasbs格式URI stripped_uri = wasbs_uri.replace("wasbs://", "") container_name, rest = stripped_uri.split("@", 1) account_domain, blob_prefix = rest.split("/", 1) if "/" in rest else (rest, "") account_name = account_domain.replace(".blob.core.windows.net", "") # 初始化匿名Blob服务客户端 account_url = f"https://{account_name}.blob.core.windows.net" blob_service_client = BlobServiceClient(account_url=account_url) container_client = blob_service_client.get_container_client(container_name) # 创建本地目标目录 os.makedirs(local_target_dir, exist_ok=True) # 遍历并下载所有匹配前缀的Blob文件 for blob_item in container_client.list_blobs(name_starts_with=blob_prefix): # 构建本地文件路径 relative_file_path = blob_item.name[len(blob_prefix):] if blob_prefix else blob_item.name local_file_path = os.path.join(local_target_dir, relative_file_path) # 确保父目录存在 os.makedirs(os.path.dirname(local_file_path), exist_ok=True) # 下载Blob到本地文件 with open(local_file_path, "wb") as local_file: blob_data = container_client.download_blob(blob_item.name).readall() local_file.write(blob_data) print(f"数据集已全部下载至本地目录: {local_target_dir}") # 使用示例 target_uri = "wasbs://course-resources@dalhussein.blob.core.windows.net/datasets/bookstore/v1/" download_dataset(target_uri, "./local_bookstore_data")
3. 关键注意点
- 该实现依赖目标Blob容器为公开可读状态,若容器是私有权限,需补充存储账户访问密钥或SAS令牌到客户端初始化逻辑中。
- 若只需下载单个文件而非整个前缀路径下的内容,可修改
list_blobs逻辑直接指定Blob名称。
内容的提问来源于stack exchange,提问作者gaut
相关产品推荐
相关产品推荐

