如何使用 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 到这个特定的文件夹。
我在网上查到用BlockBlobService
class,这是老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
)。请注意,您需要 read
和 list
权限 (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 ...
我有容器名称及其文件夹结构。我需要使用 python code 下载容器中单个文件夹中的所有文件。我也有一个 SAS URL link 到这个特定的文件夹。
BlockBlobService
class,这是老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
)。请注意,您需要 read
和 list
权限 (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 ...