我有一个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仍将被删除。
blob_list
变量的长度或计数来确定吗? - Gaurav Mantri