使用 azure-storage-blob 或 azure-storage 上传和删除 Azure 存储 Blob

Posted

技术标签:

【中文标题】使用 azure-storage-blob 或 azure-storage 上传和删除 Azure 存储 Blob【英文标题】:Upload and Delete Azure Storage Blob using azure-storage-blob or azure-storage 【发布时间】: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 库,我该怎么做?

【问题讨论】:

【参考方案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个不同的包:

    azure-storage-common 天蓝色存储blob 天蓝色存储文件 天蓝色存储队列 天蓝色存储-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 版本控制

以上是关于使用 azure-storage-blob 或 azure-storage 上传和删除 Azure 存储 Blob的主要内容,如果未能解决你的问题,请参考以下文章

尝试上传文件时出现异常

将多个 Blob 上传到 Azure 存储

如何检查/取消天蓝色的存储容器删除操作

如何在 Python 中生成 Azure blob SAS URL?

在 azure 中创建 webjob 时出现 python 包安装错误

使用 A 记录或 CNAME 进行云端分发