如何使用 Python 从给定 SAS URI 和容器名称的 Azure Blob 存储下载文件列表?

How to download a list of files from Azure Blob Storage given SAS URI and container name using Python?

我有容器名称及其文件夹结构。我需要使用 python code 下载容器中单个文件夹中的所有文件。我也有一个 SAS URL link 到这个特定的文件夹。

我在网上查到用BlockBlobServiceclass,这是老SDK的一部分。我需要找到一种方法来使用当前的 SDK。

你能帮我解决这个问题吗?

编辑 1:

这是我的 SAS URL: https://xxxx.blob.core.windows.net/<CONTAINER>/<FOLDER>?sp=r&st=2022-05-31T17:49:47Z&se=2022-06-05T21:59:59Z&sv=2020-08-04&sr=c&sig=9M8ql9nYOhEYdmAOKUyetWbCU8hoWS72UFczkShdbeY%3D

编辑 2:

已将 link 添加到找到的方法中。

编辑 3:

我还有要下载的文件的完整路径。

请尝试此代码(虽然未经测试)。

下面的代码基本上解析了 SAS URL 并创建了 ContainerClient 的实例。然后它列出容器名称以文件夹名称开头的 blob。获得该列表后,您可以下载单个 blob。

我注意到您的 SAS URL 只有 read 权限 (sp=r)。请注意,您需要 readlist 权限 (sp=rl)。您将需要使用这两个权限请求新的 SAS URL。

from urllib.parse import urlparse
from azure.storage.blob import ContainerClient

sasUrl = "https://xxxx.blob.core.windows.net/<CONTAINER>/<FOLDER>?sp=r&st=2022-05-31T17:49:47Z&se=2022-06-05T21:59:59Z&sv=2020-08-04&sr=c&sig=9M8ql9nYOhEYdmAOKUyetWbCU8hoWS72UFczkShdbeY%3D"

sasUrlParts = urlparse(sasUrl)

accountEndpoint = sasUrlParts.scheme + '://' + sasUrlParts.netloc

sasToken = sasUrlParts.query

pathParts = sasUrlParts.path.split('/')

containerName = pathParts[1]

folderName = pathParts[2]

containerClient = ContainerClient(accountEndpoint, containerName, sasToken)

blobs = containerClient.list_blobs(folderName)

for blob in blobs_list:
  blobClient = containerClient.get_blob_client(blob)
  download the blob here...blobClient.download()

更新

I have the SAS URL mentioned above, and the full paths of the files I want to download. For example: PATH 1 : Container/folder/file1.csv, PATH 2 : Container/folder/file2.txt, and so on

请看下面的代码:

from urllib.parse import urlparse
from azure.storage.blob import BlobClient

sasUrl = "https://xxxx.blob.core.windows.net/<CONTAINER>/<FOLDER>?sp=r&st=2022-05-31T17:49:47Z&se=2022-06-05T21:59:59Z&sv=2020-08-04&sr=c&sig=9M8ql9nYOhEYdmAOKUyetWbCU8hoWS72UFczkShdbeY%3D"

blobNameWithContainer = "Container/folder/file1.csv"

sasUrlParts = urlparse(sasUrl)

accountEndpoint = sasUrlParts.scheme + '://' + sasUrlParts.netloc

sasToken = sasUrlParts.query

blobSasUrl = accountEndpoint + '/' + blobNameWithContainer + '?' + sasToken;

blobClient = BlobClient.from_blob_url(blobSasUrl);
.... now do any operation on that blob ...