gpt4 book ai didi

python - Azure存储: Blob: Python: Get indicator if there are blobs at all

转载 作者:行者123 更新时间:2023-12-05 05:00:15 26 4
gpt4 key购买 nike

我有一个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,而且我也不想先迭代。我希望有一个指示器可以告诉我是否存在 Blob ,而无需执行额外的调用。

我怎样才能做到这一点?

谢谢

编辑:根据 @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_blobs 的参数
  • 当使用 blob_list 作为 delete_blobs 的参数时,它将记录类似 Failed to parse headers... (错误?)的警告。 Blob 仍然会被删除。

最佳答案

delete_blobs方法利用Blob Batch在单个请求中删除多个 blob 的操作。根据文档,批处理中的最大项目数可以为 256 或最大负载大小为 4MB(引用: https://learn.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))

关于python - Azure存储: Blob: Python: Get indicator if there are blobs at all,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63138084/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com