Azure存储:Blob:Python:Get指示符是否存在Blob

2024-05-16 19:51:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python应用程序。在此上下文中,我希望从Azure存储容器中检索匹配某个前缀的blob引用,然后一次性删除所有blob。我尝试了以下方法:

container_client: ContainerClient = ContainerClient.from_connection_string(conn_str=storage_account_connection_string, container_name=container_name)

blob_list: ItemPaged[BlobProperties] = container_client.list_blobs(name_starts_with=prefix)

container_client.delete_blobs(*blob_list, delete_snapshots="include")

只要存在与前缀匹配的blob,这就可以正常工作。但如果不是这样,我在尝试执行delete_blobs时会出现异常:

tuple index out of range

我不想使用try-except,也不想先迭代。我想有一个指标,告诉我,如果有斑点在所有不需要做额外的电话

我该怎么做

谢谢

编辑: 根据@Gaurav的建议,以下方法可行:

from azure.storage.blob import ContainerClient, BlobProperties
from azure.core.paging import ItemPaged
from typing import List

blob_paged: ItemPaged[BlobProperties] = container_client.list_blobs(name_starts_with=prefix)
blob_list: List[dict] = list(blob_paged)
number_of_blobs: int = len(blob_list)

if number_of_blobs > 0:
    container_client.delete_blobs(*blob_list, delete_snapshots="include")
    log.debug(f"Deleted '{ number_of_blobs }' blobs and snapshots...")   
else:
    log.debug(f"No blobs to be deleted...")

你应该注意三件事:

  • 使用list()将解析迭代器并将所有blob加载到内存中
  • 解析后,blob_paged不能再用作delete_blob的参数
  • 当使用blob_list作为delete_blob的参数时,它将记录一条类似Failed to parse headers...(Bug?)的警告。这些blob仍然会被删除

Tags: ofnamefromimportclientcontainerdeleteblob
1条回答
网友
1楼 · 发布于 2024-05-16 19:51:06

^{}方法利用^{}操作删除单个请求中的多个blob。根据文档,批次中的最大项目数可以是256,或者最大有效负载大小为4MB(参考:https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch#remarks

我相信您会遇到这个错误,因为您在delete_blobs方法中发送的blob超过256个,或者负载的大小超过4MB

更新

如果blobs_列表中的项目为零,您也会得到错误。您可以使用以下代码查看项目数(Ref:Getting number of elements in an iterator in Python):

number_of_blobs = len(list(blobs_list))

相关问题 更多 >