使用 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 freeze
或 pip3 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 freeze
或 pip3 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中生成 Azure blob SAS URL?