Python从Blob存储下载Blob报不存在错误及托管身份连接方案咨询
报错核心原因排查
首先明确:你能正常拿到blob_client实例根本不能证明路径、权限配置正确——因为get_blob_client()方法只是在本地根据传入的参数初始化一个客户端代理对象,全程不会和服务端发起交互,自然不会校验目标Blob的真实存在性,所有校验逻辑都会在调用download_blob()这类实际请求服务端的方法时才触发。
具体触发“指定的Blob不存在”报错的常见场景:
- 路径匹配错误:Blob Storage的对象路径是严格大小写敏感的,且
get_blob_client()需要传入相对于容器根目录的完整路径,不是仅传文件名。比如如果你的TEST.xlsx实际存在于容器内的excel/源文件/子目录下,只传TEST.xlsx就会直接报不存在;哪怕路径差一个大小写,比如实际存的是test.xlsx而代码写的TEST.xlsx,也会触发报错。 - 权限配置不匹配:Blob Storage有个安全设计:对于没有访问权限的请求,服务端不会返回“权限不足”的提示,而是统一返回“资源不存在”的错误,避免恶意用户通过枚举路径探测存储结构。这种场景下哪怕路径完全写对,只要托管身份没有目标容器的读取权限,也会报一样的错。
- 存储配置不匹配:如果存储账户开了Blob软删除、版本管理功能,当前代码默认访问的是Blob的最新活跃版本,如果最新版本已经被删除,软删除的历史版本没有开通对应访问权限的话,也会触发不存在的报错。
托管身份场景的正确实现流程
按照下面的逻辑调整代码,就能定位并解决问题:
- 初始化服务端连接时优先用枚举校验的方式验证路径和权限,不要直接跳过校验开始下载:
from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient import pandas as pd # 托管身份凭据初始化:自动适配本地Azure CLI登录、Azure虚拟机/函数/容器托管身份等场景 default_credential = DefaultAzureCredential() # 存储账户URL严格按照https://<存储账户名>.blob.core.windows.net格式填写 blob_service_client = BlobServiceClient( account_url="https://<你的存储账户名>.blob.core.windows.net", credential=default_credential ) # 获取目标容器客户端 container_client = blob_service_client.get_container_client("xx-xx-data") # 关键校验步骤:枚举容器内所有Blob的真实路径,打印出来和你要下载的文件路径做比对 print("目标容器内的Blob路径列表:") for blob in container_client.list_blobs(): print(blob.name)
- 如果上面的枚举步骤能正常打印出所有Blob的路径,说明托管身份的权限配置是正常的,只需要把你代码里
get_blob_client()传入的路径替换成打印出来的真实完整路径即可。 - 如果枚举步骤就报错或者列不出目标文件,需要检查托管身份的权限配置:确认给对应的托管身份分配了存储 Blob 数据读取者角色,且角色分配的范围精准覆盖到你要访问的目标容器,不要只把范围设到存储账户层面避免权限继承失效。
- 确认路径和权限都没问题后,再执行下载和读取逻辑:
# 替换为枚举步骤确认的真实Blob路径 blob_client = container_client.get_blob_client("打印出来的目标文件完整路径") downloaded_blob = blob_client.download_blob() df = pd.read_excel(downloaded_blob.content_as_bytes(), sheet_name='Test', skiprows=2)
内容的提问来源于stack exchange,提问作者Kelly
相关产品推荐
相关产品推荐

