微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

处理 Python 中 Azure Blob 删除客户端中 Blob 不存在场景的异常

如何解决处理 Python 中 Azure Blob 删除客户端中 Blob 不存在场景的异常

我在容器中有数千个 blob,并且从某个数据库提取了要删除的 blob 列表。

现在,不能保证列表中存在的 id/name 存在于 blob 中。所以想要做一个 deleteIfExist 类型的场景和

当 blob 不存在时它抛出的错误不是:azure.core.exceptions.ResourceNotFoundError:我可以为其编写异常块的操作。

它抛出一些通用的东西,比如:azure.storage.blob._shared.response_handlers.PartialBatchErrorException:批处理操作中出现部分失败。

以下代码

from azure.storage.blob import BlobServiceClient
blob_service_client = BlobServiceClient.from_connection_string(conn_str_for_list)
container="name1-entity"
# Instantiate a ContainerClient
container_client = blob_service_client.get_container_client(container)

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

blobs_list = entitysChunk
    print(blobs_list)

    blobs_length = len(blobs_list)
# container_client.delete_blobs(*blobs_list)
    if blobs_length <= 256:
        container_client.delete_blobs(*blobs_list)

    else:
        start = 0
        end = 256

        while end <= blobs_length:
        # each time,delete 256 blobs at most
            container_client.delete_blobs(*blobs_list[start:end])
            start = start + 256
            end = end + 256
            if start < blobs_length and end > blobs_length:
                container_client.delete_blobs(*blobs_list[start:blobs_length])

解决方法

看看下面的代码:

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:
        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("==============================")

本质上,每当出现 PartialBatchErrorException 类型的异常时,它的 parts 属性都会包含批处理中每个操作的结果的详细信息。您可以检查每个操作的状态代码以确定它是成功 (status code 202) 还是失败 (other status code)。如果状态代码为 404 (Not Found),则可以假设 blob 不存在。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。