Azure存储:Blob:Python:Get指示符是否存在Blob
我有一个Python应用程序。在此上下文中,我希望从Azure存储容器中检索匹配某个前缀的blob引用,然后一次性删除所有blob。我尝试了以下方法:Azure存储:Blob:Python:Get指示符是否存在Blob,python,python-3.x,azure,azure-storage,azure-storage-blobs,Python,Python 3.x,Azure,Azure Storage,Azure Storage Blobs,我有一个Python应用程序。在此上下文中,我希望从Azure存储容器中检索匹配某个前缀的blob引用,然后一次性删除所有blob。我尝试了以下方法: container_client: ContainerClient = ContainerClient.from_connection_string(conn_str=storage_account_connection_string, container_name=container_name) blob_list: ItemPaged[Bl
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\u 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_blob的参数时,它将记录一条警告,如
(Bug?)。这些blob仍然会被删除未能解析头…
谢谢你的回复。当没有与前缀匹配的blob时,会发生此异常(可重复)。哦,我忘了提到,如果批大小为零,服务也会返回错误。是的,但问题是如何确定批大小分别为零以及没有要检索的blob?是否没有表明这一点的属性?谢谢你不是简单地检查
blob_list
变量的长度或计数就可以确定吗?哦!真令人惊讶。让我试试看。我马上回来。
number_of_blobs = len(list(blobs_list))