【问题标题】:Upload and Delete Azure Storage Blob using azure-storage-blob or azure-storage使用 azure-storage-blob 或 azure-storage 上传和删除 Azure 存储 Blob
【发布时间】:2020-03-12 23:49:54
【问题描述】:

我参考 Microsoft 的 Quick Start guide 了解适用于 Python 的 Azure Blob 存储客户端库 v12。它详细说明了如何上传 blob,但我想删除一个 blob。 This answer 推荐使用:

from azure.storage.blob import BlobService

blob_service = BlobService(account_name=accountName, account_key=accountKey)
blob_service.delete_blob(container_name, blob_name)

但是,我尝试了,但出现以下错误:

ImportError: cannot import name 'BlobService' from 'azure.storage.blob'

Another answer 推荐使用from azure.storage.blob import BlockBlobService,但我也得到了与上面相同的ImportError

我通过 * 搜索以解决上述错误,发现 this answer 建议使用旧版本的库 (azure-storage) 和 another answer 建议安装整个 azure 库,但我想请改用最新的库。

如何使用最新的azure-storage-blob 库上传文件和删除 blob?或者,如果我是 2019 年的新用户并且正在遵循上述快速入门指南,但我想使用这里的许多答案推荐的旧 azure-storage 库,我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    从 2019 年开始更新答案

    上传和删除 Blob 有两种方法,第一种使用新的 azure-storage-blob 库(2019 年),第二种使用旧的 azure-storage 库(2019 年之前)。

    如果您是 2019 年以后的 updated Quick Start guide 之后的新用户,请使用方法 1。


    方法1.使用新的azure-storage-blob库(2019)

    如果已安装旧的azure-storage 库,请先卸载它,然后安装新的azure-storage-blob 库。对 Python 3 使用 pip3 或对 Python 2 使用 pip

    pip3 uninstall azure-storage
    pip3 install azure-storage-blob
    

    根据您的 Python 版本,pip freezepip3 freeze 应该显示以下内容:

    azure-common==1.1.23
    azure-core==1.0.0
    azure-nspkg==3.0.2
    azure-storage-blob==12.0.0
    

    如果要使用同一客户端上传文件和删除 blob,请使用 ContainerClient。文档可以在here找到。

    使用ContainerClient上传文件的代码:

    from azure.storage.blob import ContainerClient
    
    CONNECT_STR = ""
    CONTAINER_NAME = ""
    input_file_path = "/path/to/your/input_file.csv"
    output_blob_name = "output_blob.csv"
    
    container_client = ContainerClient.from_connection_string(conn_str=CONNECT_STR, container_name=CONTAINER_NAME)
    
    # Upload file
    with open(input_file_path, "rb") as data:
        container_client.upload_blob(name=output_blob_name, data=data)
    
    

    使用ContainerClient删除blob的代码:

    from azure.storage.blob import ContainerClient
    
    CONNECT_STR = ""
    CONTAINER_NAME = ""
    blob_name = "output_blob.csv"
    
    container_client = ContainerClient.from_connection_string(conn_str=CONNECT_STR, container_name=CONTAINER_NAME)
    
    # Delete blob
    container_client.delete_blob(blob=blob_name)
    

    或者,您可以使用BlobServiceClient 按照Quick Start guide 上传文件。

    使用BlobServiceClient上传文件的代码:

    from azure.storage.blob import BlobServiceClient
    
    CONNECT_STR = ""
    CONTAINER_NAME = ""
    input_file_path = "/path/to/your/input_file.csv"
    output_blob_name = "output_blob.csv"
    
    blob_service_client = BlobServiceClient.from_connection_string(CONNECT_STR)
    blob_client = blob_service_client.get_blob_client(container=CONTAINER_NAME, blob=output_blob_name)
    
    # Upload file
    with open(input_file_path, "rb") as data:
        blob_client.upload_blob(data=data)
    

    方法 2. 使用旧的 azure-storage 库(2019 年之前)

    如果已安装新的azure-storage-blob 库,请先卸载它,然后安装旧的azure-storage 库。对 Python 3 使用 pip3,对 Python 2 使用 pip

    pip3 uninstall azure-storage-blob
    pip3 install azure-storage
    

    根据您的 Python 版本,pip freezepip3 freeze 应该显示以下内容:

    azure-common==1.1.23
    azure-core==1.0.0
    azure-nspkg==3.0.2
    azure-storage==0.36.0
    

    我们可以使用BlockBlobService客户端上传文件和删除blob。

    使用BlockBlobService上传文件的代码:

    from azure.storage.blob import BlockBlobService
    
    AZURE_STORAGE_ACCOUNT_NAME = ""
    AZURE_STORAGE_ACCOUNT_KEY = ""
    CONTAINER_NAME = ""
    input_file_path = "/path/to/your/input_file.csv"
    output_blob_name = "output_blob.csv"
    
    block_blob_service = BlockBlobService(account_name=AZURE_STORAGE_ACCOUNT_NAME, account_key=AZURE_STORAGE_ACCOUNT_KEY)
    
    # Upload file
    block_blob_service.create_blob_from_path(CONTAINER_NAME, output_blob_name, input_file_path)
    
    

    使用BlockBlobService删除blob的代码:

    from azure.storage.blob import BlockBlobService
    
    AZURE_STORAGE_ACCOUNT_NAME = ""
    AZURE_STORAGE_ACCOUNT_KEY = ""
    CONTAINER_NAME = ""
    blob_name = "output_blob.csv"
    
    block_blob_service = BlockBlobService(account_name=AZURE_STORAGE_ACCOUNT_NAME, account_key=AZURE_STORAGE_ACCOUNT_KEY)
    
    # Delete blob
    block_blob_service.delete_blob(CONTAINER_NAME, blob_name)
    

    背景

    正如answer 中所述,自 0.37.0 以来,azure-storage 库中引入了重大更改。根据change log,不仅命名空间发生了变化,而且库也被分成了5个不同的包:

    1. azure-storage-common
    2. 天蓝色存储blob
    3. 天蓝色存储文件
    4. 天蓝色存储队列
    5. 天蓝色存储-nspkg

    尽管其他帖子中已经提供了许多答案,但我想指出,对于 2019 年以后尝试此功能的新用户,尝试为该库找到正确的代码是很复杂的,因为这里提供了许多(如果不是大多数)答案在 * 上仍然引用旧库 azure-storage,但新用户遵循 Microsoft 于 2019 年 5 月更新的新教程,它使用新的 azure-storage-blob 代替。搜索帮助的新用户会无意中发现使用旧的 azure-storage 库的旧答案,但这些对他们不起作用。

    【讨论】:

      【解决方案2】:

      没有 connection_string - 可以通过 azure.storage.blob 中的 blobserviceclient 实现以下操作 从 azure.storage.blob 导入 BlobServiceClient def upload_file_to_blob(FilePath,filename):

      STORAGEACCOUNTURL= '<<>>'
      STORAGEACCOUNTKEY= '<<>>'
      
      CONTAINERNAME= '<<>>'
      BLOBNAME= filename
      LOCALFILENAME= FilePath+"/"+BLOBNAME
      
      BlobServiceClient.from_connection_string(account_url=STORAGEACCOUNTURL,credential=STORAGEACCOUNTKEY)
      blob_service_client = BlobServiceClient(account_url=STORAGEACCOUNTURL,credential=STORAGEACCOUNTKEY)
      blob_client = blob_service_client.get_blob_client(container=CONTAINERNAME, blob=BLOBNAME)
      
      # Upload file
      with open(LOCALFILENAME, "rb") as data:
          blob_client.upload_blob(data=data,overwrite=True)
      

      【讨论】:

      • 如果 Overwrite=False,无法将相同的 blob 上传到 blob 存储。必须更改 blobname。相同的 blob 可能需要激活 blob 版本控制