Azure 存储:Blob:Python:获取指示符是不是存在 Blob

Posted

技术标签:

【中文标题】Azure 存储:Blob:Python:获取指示符是不是存在 Blob【英文标题】:Azure Storage: Blob: Python: Get indicator if there are blobs at allAzure 存储:Blob:Python:获取指示符是否存在 Blob 【发布时间】: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 仍会被删除。

【问题讨论】:

【参考方案1】:

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

我相信您收到此错误是因为您在 delete_blobs 方法中发送了超过 256 个 blob,或者负载大小超过 4MB。

更新

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

number_of_blobs = len(list(blobs_list))

【讨论】:

感谢您的回复。当没有与前缀匹配的 blob 时,会发生此异常(可重现)。 哦,我忘了说如果批量大小为零,服务也会返回错误。 是的,但问题是如何确定批量大小为零分别没有要检索的 blob?没有财产表明这一点吗?谢谢 您不能简单地检查blob_list 变量的长度或计数来确定吗? 哦!这很令人惊讶。让我试试看。我会尽快回复。

以上是关于Azure 存储:Blob:Python:获取指示符是不是存在 Blob的主要内容,如果未能解决你的问题,请参考以下文章

Azure 函数 blob 存储文件名

仅从 Azure 存储 [Azure-Blob][REST] 中的 Blob 列表获取特定元数据

获取 Azure 存储容器中的 blob 计数

如何在 MS Azure 中为我的 blob 存储中的 blob 提取上次修改日期

使用 .NET SDK 获取 Azure Blob 存储区域?

列出存储容器内容时获取 Azure 存储以返回 blob URL