从容器中删除 blob 时如何在 python 中对 Azure PartialBatchErrorException 进行异常处理

Posted

技术标签:

【中文标题】从容器中删除 blob 时如何在 python 中对 Azure PartialBatchErrorException 进行异常处理【英文标题】:How to do Exception handling for Azure PartialBatchErrorException in python while deleting blobs from a container 【发布时间】:2021-09-10 15:14:24 【问题描述】:

如何打印它试图删除的 blob 并由于部分错误而失败? 使用 Azure 库,(azure.storage.blob import BlobServiceClient)我试图从名称列表中删除 blob(如果存在)。

有时,在某些情况下,作为输入提供的名称列表没有具有该名称的 blob。在这些情况下,我们会得到“PartialBatchErrorException”。根据他们的文档,它有 3 个选项:PartialBatchErrorException(message, response, parts)

文档:https://docs.microsoft.com/en-us/python/api/azure-storage-blob/azure.storage.blob.partialbatcherrorexception?view=azure-python

但是,如果我在列表中传递了 1000 多个文件,那么使用这个,我想知道哪个成功,哪个失败,坦率地说,我无论如何也看不到要解决这个问题。这似乎是一个相当简单的问题,但不确定 exceptionClass 是否没有打印这个或者我是否遗漏了一些东西。

问题 2:很想看看是否有人有删除 blob 的并行方法。

rom azure.storage.blob import BlobServiceClient,PartialBatchErrorException
conn_str_for_list = "connection-string"
blob_service_client = BlobServiceClient.from_connection_string(conn_str_for_list)
container="blob-container-name"

container_client = blob_service_client.get_container_client(container)

file_name = "blobs.txt"
fileobj = open(file_name, "r")
entityIdsList = [line.rstrip() for line in fileobj]
fileobj.close()

blobs_list = entityIdsList

print(blobs_list)

try:
    result = container_client.delete_blobs(*blobs_list)
    for item in result:
        print(item.status_code)
except PartialBatchErrorException as e:
    print(e.message)
    print("-----------------------")
    print(e.response)
    print("-----------------------")
    print(e.parts)
    print("-----------------------")
    for part in e.parts:
        if (part.status_code == 202):
            print("Blob delete request was accepted.")
        elif (part.status_code == 404):
            print("Blob does not exist. Consider it deleted.")
        else:
            print("Something else happened. You better take a look at it.")
            print(part)
        print("==============================")

这部分东西只有 status_code,例如,我无法看到他为哪个 blob 获得 404。

【问题讨论】:

【参考方案1】:

部分回答您的问题。

但是,如果我在列表中传递了 1000 个文件,我想要使用这个 哪个成功,哪个失败,坦率地说,我反正没看到 把这个弄出来。这似乎是一个相当简单的问题,但不确定是否 exceptionClass 没有打印这个,或者我错过了什么。

考虑到part 本质上是HttpClientTransportResponse 类型的对象,您可以访问它的request 属性,然后访问该request 属性的url 属性以获取实际的blob URL。

例如,您可以使用print("Blob: " + part.request.url),它将以/container-name/blob-name 格式打印blob 的URL。

这是修改后的代码:

from azure.storage.blob import BlobServiceClient,PartialBatchErrorException
conn_str_for_list = "connection-string"
blob_service_client = BlobServiceClient.from_connection_string(conn_str_for_list)
container="blob-container-name"

container_client = blob_service_client.get_container_client(container)

file_name = "blobs.txt"
fileobj = open(file_name, "r")
entityIdsList = [line.rstrip() for line in fileobj]
fileobj.close()

blobs_list = entityIdsList

print(blobs_list)

try:
    result = container_client.delete_blobs(*blobs_list)
    for item in result:
        print(item.status_code)
except PartialBatchErrorException as e:
    print(e.message)
    print("-----------------------")
    print(e.response)
    print("-----------------------")
    print(e.parts)
    print("-----------------------")
    for part in e.parts:
        print("Blob: " + part.request.url)
        if (part.status_code == 202):
            print("Blob delete request was accepted.")
        elif (part.status_code == 404):
            print("Blob does not exist. Consider it deleted.")
        else:
            print("Something else happened. You better take a look at it.")
            print(part)
        print("==============================")

【讨论】:

再次感谢兄弟,BlobServiceClient 是否并行运行删除? AFAIK,没有。客户端将发送一个请求,最多可包含 256 个 Blob。

以上是关于从容器中删除 blob 时如何在 python 中对 Azure PartialBatchErrorException 进行异常处理的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 blockblobservice 的 delete_blob 方法删除 azure 容器内的文件夹(blob)?

从 blob 容器中删除文件夹

无法从特定 blob 容器中删除文件

列出并恢复软删除的 blob - azure python

下载后如何从 azure blob 存储中删除文件

Powershell脚本从blob容器的子文件夹中删除文件