如何使用Python通过ADLS Gen2目录级SAS URL获取文件夹内容
ADLS Gen2 目录级SAS URL Python读取实现方案
不需要使用存储账号连接字符串,只要持有的目录级SAS具备列表、读取权限,可直接通过官方SDK实现目录内容遍历、文件读取,以下是两种经过验证的可落地方案:
方案1:使用ADLS Gen2专属SDK(推荐,原生支持目录语义)
- 前置依赖安装:执行命令
pip install azure-storage-file-datalake安装官方DataLake存储SDK - 实现代码:
from azure.storage.filedatalake import DataLakeDirectoryClient # 替换为你持有的完整目录级SAS URL # URL格式参考:https://<存储账号名>.dfs.core.windows.net/<容器名>/<目标目录层级>?<SAS签名参数> dir_sas_url = "替换为你的目录SAS URL" # 直接通过目录SAS URL初始化客户端,无需额外传入账号密钥、连接字符串 dir_client = DataLakeDirectoryClient.from_directory_url(dir_sas_url) # 遍历目录下内容,recursive=False表示仅遍历当前层级,不递归子目录;需要递归改为True即可 for path_item in dir_client.get_paths(recursive=False): if path_item.is_directory: print(f"[子目录] {path_item.name}") else: print(f"[文件] {path_item.name},大小:{path_item.size}字节") # 读取文件内容,文本文件可指定对应编码,二进制文件直接取readall()的bytes结果即可 file_client = dir_client.get_file_client(path_item.name.split("/")[-1]) content = file_client.download_file().readall().decode("utf-8") print(f"文件内容预览:{content[:200]}...\n")
注意:该方案下SAS的权限范围完全和你申请的目录级范围一致,无法访问当前目录层级以上的内容,符合目录SAS的权限边界设计
方案2:使用Blob兼容SDK(适合已有Blob SDK依赖的场景)
ADLS Gen2提供Blob API兼容层,也可以通过通用Blob SDK实现读取,不需要额外安装DataLake专属包
- 前置依赖安装:执行命令
pip install azure-storage-blob安装Blob存储SDK - 实现代码:
from urllib.parse import urlparse from azure.storage.blob import ContainerClient dir_sas_url = "替换为你的目录SAS URL" # ADLS Gen2 Blob端点和DFS端点的差异仅为域名中的dfs替换为blob parsed_url = urlparse(dir_sas_url.replace(".dfs.core.windows.net", ".blob.core.windows.net")) path_segments = parsed_url.path.strip("/").split("/") container_name = path_segments[0] target_dir_prefix = "/".join(path_segments[1:]) sas_token = parsed_url.query container_conn_url = f"{parsed_url.scheme}://{parsed_url.netloc}/{container_name}?{sas_token}" container_client = ContainerClient.from_container_url(container_conn_url) # 按目录前缀遍历内容,delimiter="/"表示模拟目录层级,不递归子目录 for item in container_client.walk_blobs(name_starts_with=f"{target_dir_prefix}/", delimiter="/"): if item.get("is_prefix"): print(f"[子目录] {item.name}") else: print(f"[文件] {item.name},大小:{item.size}字节") content = container_client.download_blob(item.name).readall().decode("utf-8") print(f"文件内容预览:{content[:200]}...\n")
常见问题排查
- 若返回403权限错误,先检查SAS令牌的
sp(权限)字段是否包含l(列表)、r(读取)权限,同时确认SAS的se(过期时间)字段未超时- 读取GB级以上大文件时,不要使用
readall()一次性加载全量内容到内存,改用chunks()方法分块迭代读取,避免内存溢出- 若目录下文件数量超过5000,SDK会自动分页处理,不需要手动写分页逻辑
内容的提问来源于stack exchange,提问作者pratibha
相关产品推荐
相关产品推荐

