Azure存储:Blob:Python:获取是否存在Blob指示器

3

我有一个Python应用程序。在这个情况下,我想从与特定前缀匹配的Azure Storage容器中检索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,这个功能就能正常工作。但是如果没有匹配的blob,当尝试执行delete_blobs时,会出现异常:
tuple index out of range 我不想使用try except,也不想先迭代。我希望有一个指示器告诉我是否存在任何blob,而无需进行额外调用。
我该如何做?
谢谢
编辑: 根据@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_blobs的参数。
  • 当将blob_list用作delete_blobs的参数时,它会记录一个警告信息,如“无法解析头文件...”(Bug?)。但blob仍将被删除。
1个回答

4

delete_blobs方法使用Blob Batch操作在单个请求中删除多个blob。根据文档,批处理中的最大项目数可以为256或有效负载大小最大为4MB(参考:https://learn.microsoft.com/en-us/rest/api/storageservices/blob-batch#remarks)。

我认为您之所以会出现此错误,是因为您在delete_blobs方法中发送的blob数量超过了256个,或者有效负载超过了4MB。

更新

如果blobs_list中的项目数为零,您也将收到错误提示。您可以使用以下代码查看项目数(参考:Getting number of elements in an iterator in Python):

number_of_blobs = len(list(blobs_list))

哦,我忘了提到服务还会在批处理大小为零时返回错误。 - Gaurav Mantri
是的,但问题是如何确定批处理大小为零,或者没有要检索的 blob?有没有指示这一点的属性?谢谢。 - quervernetzt
你难道不能简单地检查 blob_list 变量的长度或计数来确定吗? - Gaurav Mantri
哦!这真是令人惊讶。让我试一下。我很快就会回复的。 - Gaurav Mantri
正如您所看到的,它不是一个列表,而是ItemPaged [BlobProperties],它不包括实际的Blob,而只包含一个迭代器来惰性地检索它们(据我所知)。 - quervernetzt
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接