You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:57:22