首页 > 解决方案 > 从容器中删除 blob 时如何在 python 中对 Azure PartialBatchErrorException 进行异常处理

问题描述

如何打印由于部分错误而尝试删除并失败的 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。

标签: pythonazureazure-storageazure-blob-storage

解决方案


部分回答您的问题。

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

考虑到part本质上是一个类型的对象HttpClientTransportResponse,您可以访问它的request属性,然后访问该url属性的request属性以获取实际的 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("==============================")

推荐阅读