【问题标题】: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 仍会被删除。

【问题讨论】:

    标签: python python-3.x azure azure-storage azure-blob-storage


    【解决方案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 变量的长度或计数来确定吗?
    • 哦!这很令人惊讶。让我试试看。我会尽快回复。
    猜你喜欢
    • 2013-07-05
    • 2011-02-08
    • 1970-01-01
    • 2018-05-07
    • 2015-11-04
    • 2018-07-13
    • 1970-01-01
    • 2017-10-24
    • 2021-02-17
    相关资源
    最近更新 更多