【发布时间】:2020-11-18 03:03:56
【问题描述】:
我有一个 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 时会遇到异常:
元组索引超出范围
我不想使用 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_blobs 的参数时,它会记录类似
Failed to parse headers...的警告(错误?)。这些 blob 仍会被删除。
【问题讨论】:
标签: python python-3.x azure azure-storage azure-blob-storage