如何使用blockblobservice的delete_blob方法删除azure容器中的文件夹(blob)?

时间:2018-03-20 14:50:10

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

delete_blob()似乎只删除容器内的文件以及容器内的文件夹和子文件夹。但是当我尝试从容器中删除文件夹时,我在python中看到以下错误。

Client-Request-ID = 7950669c-2c4a-11e8-88e7-00155dbf7128重试策略不允许重试:Server-Timestamp = Tue,201 Mar 2018 14:25:00 GMT,Server-Request- ID = 54d1a5d6-b01e-007b-5e57-c08528000000,HTTP状态代码= 404,异常=指定的blob不存在.ErrorCode:BlobNotFound BlobNotFound指定的blob不存在.RequestId:54d1a5d6-b01e-007b- 5e57-c08528000000Time:2018-03-20T14:25:01.2130063Z

azure.common.AzureMissingResourceHttpError:指定的blob不存在.ErrorCode:BlobNotFound BlobNotFound指定的blob不存在。 请求ID:54d1a5d6-b01e-007B-5e57-c08528000000 时间:2018-03-20T14:25:01.2130063Z

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:2)

从流程中可以理解两件事,您可以使用 delete_blob 删除特定文件,文件夹,图片...(blob),但是如果您要删除容器,你必须使用 delete_container ,这将删除其中的所有blob,这里是我创建的一个样本,用于删除路径/虚拟文件夹中的blob:

from azure.storage.blob import BlockBlobService

block_blob_service = BlockBlobService(account_name='yraccountname', account_key='accountkey')
print("Retreiving blobs in specified container...")
blob_list=[]
container="containername"
def list_blobs(container):
        try:

                global blob_list
                content = block_blob_service.list_blobs(container)
                print("******Blobs currently in the container:**********")
                for blob in content:
                        blob_list.append(blob.name)
                        print(blob.name)
        except:
                print("The specified container does not exist, Please check the container name or if it exists.")
list_blobs(container)
print("The list() is:")
print(blob_list)
print("Delete this blob: ",blob_list[1])
#DELETE A SPECIFIC BLOB FROM THE CONTAINER
block_blob_service.delete_blob(container,blob_list[1],snapshot=None)
list_blobs(container)

请参阅我的仓库中的代码以及自述文件部分中的说明以及新的存储脚本:https://github.com/adamsmith0016/Azure-storage

答案 1 :(得分:1)

您不能删除Azure blob中的非空文件夹,但是如果首先删除子文件夹中的文件,则可以实现此目的。下面的解决方法将开始将其从文件中删除到父文件夹中。

from azure.storage.blob import BlockBlobService
blob_client = BlockBlobService(account_name='', account_key='')
containername = 'XXX'
foldername = 'XXX'

def delete_folder(containername, foldername):
    folders = [blob.name for blob in blob_client.list_blobs(containername, prefix=foldername)]
    folders.sort(reverse=True, key=len)
    if len(folders) > 0:
        for folder in folders:
            blob_client.delete_blob(containername, folder)
            print("deleted folder",folder)

答案 2 :(得分:0)

在Azure Blob存储中,因为这样的文件夹不存在。它只是blob名称的前缀。例如,如果您看到名为images的文件夹并且其中包含名为myfile.png的blob,则基本上该blob的名称为images/myfile.png。由于文件夹不存在(它们是虚拟的),因此您无法直接删除该文件夹。

您需要做的是在该文件夹中单独删除所有blob(或者换句话说,删除名称以该虚拟文件夹名称/路径开头的blob。一旦删除了所有blob,该文件夹就会自动消失。

为了实现此目的,首先需要获取名称以虚拟文件夹路径开头的所有blob。为此,您将使用list_blobs方法并在prefix参数中指定虚拟文件夹路径。这将为您提供以该前缀开头的blob列表。获得该列表后,您将逐个删除blob。

答案 3 :(得分:0)

其他人在python中搜索解决方案。这对我有用。

首先创建一个变量,用于存储要删除的文件夹中的所有文件。

然后对于该文件夹中的每个文件,通过声明容器的名称,然后是实际的foldername.name来删除该文件。

删除文件夹中的所有文件后,文件夹将以天蓝色删除。

def delete_folder(self, containername, foldername):
    folders = [blob for blob in blob_service.block_blob_service.list_blobs(containername) if blob.name.startswith(foldername)]
    if len(folders) > 0:
        for folder in folders:
            blob_service.block_blob_service.delete_blob(containername, foldername.name)
            print("deleted folder",folder name)

答案 4 :(得分:0)

使用 list_blobs(name_starts_with=folder_name)delete_blob()

完整代码:

blob_service_client = BlobServiceClient.from_connection_string(conn_str=CONN_STR)
blob_client = blob_service_client.get_container_client(AZURE_BLOBSTORE_CONTAINER)
[blob_client.delete_blob(blob.name)
 for blob in blob_client.list_blobs(name_starts_with=FOLDER_NAME)]