Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure存储:Blob:Python:Get指示符是否存在Blob_Python_Python 3.x_Azure_Azure Storage_Azure Storage Blobs - Fatal编程技术网

Azure存储:Blob:Python:Get指示符是否存在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

我有一个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\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。根据文档,批次中的最大项目数可以是256,或者最大有效负载大小为4MB(参考:)

我相信您会遇到这个错误,因为您在delete_blobs方法中发送的blob超过256个,或者负载的大小超过4MB

更新

如果blobs_列表中的项目为零,您也会得到错误。您可以使用以下代码查看项目数(参考:):


谢谢你的回复。当没有与前缀匹配的blob时,会发生此异常(可重复)。哦,我忘了提到,如果批大小为零,服务也会返回错误。是的,但问题是如何确定批大小分别为零以及没有要检索的blob?是否没有表明这一点的属性?谢谢你不是简单地检查
blob_list
变量的长度或计数就可以确定吗?哦!真令人惊讶。让我试试看。我马上回来。
number_of_blobs = len(list(blobs_list))