通过Azure Notebook访问Blob容器CSV文件出现PermissionError报错
Azure Python Notebook 访问 Blob 存储文件 PermissionError 报错解决方案
问题描述
在 Azure Python Notebook 中访问 Blob 存储容器内约 2GB 大小的 csv 文件时,此前运行正常的代码触发如下报错:
PermissionError: [Errno 13] Permission denied: 'part-00000-tid-9128541598398997257-8ae9f3ab-ad94-4ed6-ac2d-91b488393378-72-1-c000.csv'
根因排查方向
- 存储访问权限变更:最近是否调整了存储账号的 IAM 权限、网络防火墙规则,当前 Notebook 使用的托管身份/服务主体/SAS 令牌是否过期、是否还持有
存储Blob数据读取者及以上权限,Notebook 出站 IP 是否在存储账号白名单范围内。 - 本地临时目录权限异常:2GB 大文件从 Blob 拉取时会先写入 Notebook 运行环境的本地临时目录,近期如果有环境更新调整了目录权限、临时目录磁盘已满,都会触发权限类报错。
- 目标文件状态异常:确认目标 csv 文件是否被其他进程锁定、是否被移入归档存储层未解冻、文件级访问权限是否被修改。
修复方案
步骤1:验证基础访问权限
先运行以下代码测试是否有权限访问目标容器,如果列取文件失败,优先修复存储访问身份/网络规则问题:
from azure.storage.blob import BlobServiceClient # 替换为你实际使用的存储连接字符串/身份验证配置 blob_service_client = BlobServiceClient.from_connection_string("<你的存储连接字符串>") container_client = blob_service_client.get_container_client("<你的Blob容器名>") # 测试列取容器内文件权限 for blob in container_client.list_blobs(): print(blob.name)
步骤2:自定义临时下载目录
如果容器访问正常,手动指定当前运行内核有读写权限的目录作为临时下载目录,避免默认临时目录权限问题:
import os import tempfile # 创建自定义临时目录,确保当前内核有读写权限 custom_temp_path = "./blob_download_temp" os.makedirs(custom_temp_path, exist_ok=True) tempfile.tempdir = custom_temp_path # 之后再运行原有读取文件的逻辑即可
步骤3:调整大文件分片下载配置
针对2GB大文件,使用分片并发下载逻辑,避免单次写入触发权限锁:
target_blob_name = "part-00000-tid-9128541598398997257-8ae9f3ab-ad94-4ed6-ac2d-91b488393378-72-1-c000.csv" blob_client = container_client.get_blob_client(target_blob_name) # 按10MB分片、5并发下载到本地 with open("./local_target.csv", "wb") as local_file: download_stream = blob_client.download_blob( max_concurrency=5, chunk_size=10 * 1024 * 1024 ) download_stream.readinto(local_file)
内容的提问来源于stack exchange,提问作者Aakash Pahuja
相关产品推荐
相关产品推荐

