我有一个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...")
你应该注意三件事:
Failed to parse headers...
(Bug?)的警告。这些blob仍然会被删除李>
^{} 方法利用^{} 操作删除单个请求中的多个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):
相关问题 更多 >
编程相关推荐