从容器中删除 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 进行异常处理的主要内容,如果未能解决你的问题,请参考以下文章