如何在Python中使用Azure Blob存储服务?

准备

假设你已经正在使用Azure云服务,假设你已经安装了Azure的Python SDK (如果你需要安装可以运行:pip install Azure)

本文概述

Azure Blob存储是将云中的非结构化数据作为对象(即blob)存储的服务。Blob存储可以存储任何类型的文本或二进制数据,例如文档,媒体文件或应用程序安装程序。Blob存储也称为对象存储。
本文将向您展示如何使用Blob存储执行常见场景。示例以Python编写,并使用Microsoft Azure Storage SDK for Python。涵盖的场景包括Blob的上传,表列(Listing),下载和删除。

什么是Blob存储?

Azure Blob存储是一种用于存储大量非结构化对象数据(如文本或二进制数据)的服务,可通过HTTP或HTTPS从世界任何地方访问。您可以使用Blob存储来公开向世界公开数据,也可以私有地存储应用程序数据。
Blob存储的常见用途包括:

  • 将图像或文档直接提供给浏览器
  • 存储用于分布式访问的文件
  • 串流视频和音频
  • 存储用于备份和还原,灾难恢复和归档的数据
  • 存储用于内部部署或Azure托管服务进行分析的数据

Blob服务概念

Blob服务包含以下组件:

存储帐户:通过存储帐户完成对Azure Storage的所有访问。该存储帐户可以是专用于存储对象/ Blob 的通用存储帐户或Blob存储帐户。有关详细信息,请参阅关于Azure存储帐户。
容器:容器提供一组一组Blob。所有的斑点都必须在容器中。帐户可以包含无限数量的容器。容器可以存储无限数量的斑点。请注意,容器名称必须为小写。
Blob:任何类型和大小的文件。Azure存储提供三种类型的blob:块blob,页面blob和附加blob。
阻止块是存储文本或二进制文件(如文档和媒体文件)的理想选择。附加blob类似于阻止blob,因为它们由块组成,但是它们针对追加操作进行了优化,因此它们对于记录方案很有用。单个块BLOB可以包含多达50,000个块,最多可达100 MB,总体大小略高于4.75 TB(100 MB X 50,000)。单个追加blob可以包含多达50,000个块,最多4 MB,总大小略高于195 GB(4 MB X 50,000)。
页面大小可以达到1 TB,并且对于频繁的读/写操作更有效。Azure虚拟机将页面blob用作操作系统和数据磁盘。
有关命名容器和Blob的详细信息,请参阅命名和引用容器,Blob和元数据。

创建Azure存储帐户

创建您的第一个Azure存储帐户的最简单方法是使用Azure门户。(https://azure.microsoft.com)
您还可以使用Azure PowerShell,Azure CLI或.NET的存储资源提供程序客户端库来创建Azure存储帐户。
如果您现在不想创建存储帐户,还可以使用Azure存储模拟器在本地环境中运行和测试代码。

创建一个容器

根据您想要使用的blob类型,创建一个BlockBlobService,AppendBlobService或PageBlobService对象。以下代码使用BlockBlobService对象。在您希望以编程方式访问Azure Block Blob Storage的任何Python文件的顶部附近添加以下内容。

from azure.storage.blob import BlockBlobService

以下代码使用存储帐户名称和帐户密钥创建BlockBlobService对象。用您的帐户名称和密钥替换’myaccount’和’mykey’。

block_blob_service = BlockBlobService(account_name='myaccount', account_key='mykey')

Azure存储中的每个Blob都必须驻留在容器中。容器形成blob名称的一部分。例如,mycontainer这些示例blob URI中的容器的名称:

https://storagesample.blob.core.windows.net/mycontainer/blob1.txt
https://storagesample.blob.core.windows.net/mycontainer/photos/myphoto.jpg

容器名称必须是有效的DNS名称,符合以下命名规则:
容器名称必须以字母或数字开头,并且只能包含字母,数字和破折号( – )字符。
每个破折号( – )字符必须紧跟在一个字母或数字之后。容器名称中不允许连续破折号。
容器名称中的所有字母必须为小写。
容器名称必须为3到63个字符。

请注意,容器的名称必须始终为小写。如果您在容器名称中包含大写字母,否则违反容器命名规则,则可能会收到400错误(错误请求)。
在以下代码示例中,您可以使用BlockBlobService对象创建容器(如果不存在)。

block_blob_service.create_container('mycontainer')

默认情况下,新容器是私有的,因此您必须指定存储访问密钥(如前所述)从该容器下载blob。如果要使容器中的blob可用于所有人,您可以使用以下代码创建容器并传递公共访问级别。

from azure.storage.blob import PublicAccess
block_blob_service.create_container('mycontainer', public_access=PublicAccess.Container)

或者,您可以使用以下代码创建容器后修改容器。

block_blob_service.set_container_acl('mycontainer', public_access=PublicAccess.Container)

此更改后,Internet上的任何人都可以在公共容器中看到blob,但只能修改或删除它们。

将blob上载到容器中

要创建块blob并上传数据,请使用create_blob_from_path,create_blob_from_stream,create_blob_from_bytes或create_blob_from_text方法。它们是当数据大小超过64 MB时执行必要分块的高级方法。
create_blob_from_path从指定的路径上传文件的内容,create_blob_from_stream从已打开的文件/流中上传内容。create_blob_from_bytes上传一个字节数组,create_blob_from_text使用指定的编码(默认为UTF-8)上传指定的文本值。
以下示例将sunset.png文件的内容上传到myblob blob中。

from azure.storage.blob import ContentSettings
block_blob_service.create_blob_from_path(
    'mycontainer',
    'myblockblob',
    'sunset.png',
    content_settings=ContentSettings(content_type='image/png')
            )

列出容器中的Blob

要列出容器中的blob,请使用list_blobs方法。此方法返回一个生成器。以下代码将容器中每个blob 的名称输出到控制台。

generator = block_blob_service.list_blobs('mycontainer')
for blob in generator:
    print(blob.name)

下载Blob

要从blob下载数据,请使用get_blob_to_path,get_blob_to_stream,get_blob_to_bytes或get_blob_to_text。它们是当数据大小超过64 MB时执行必要分块的高级方法。
以下示例演示如何使用get_blob_to_path下载myblob blob 的内容并将其存储在out-sunset.png文件中。

block_blob_service.get_blob_to_path('mycontainer', 'myblockblob', 'out-sunset.png')

删除一个Blob

最后删除一个blob,调用delete_blob。

block_blob_service.delete_blob('mycontainer', 'myblockblob')

以追加的方式写入一个Blob

append blob已针对追加操作(如日志记录)进行了优化。像块blob一样,附加blob由块组成,但是当您将一个新块添加到附加blob时,它总是附加到blob的末尾。您不能更新或删除附加blob中的现有块。附加blob的块ID不会像块Blob一样暴露。
附加blob中的每个块可以是不同的大小,最多可以达到4 MB,而追加blob最多可包含50,000个块。因此,追加Blob的最大大小稍大于195 GB(4 MB×50,000个块)。
下面的示例创建一个新的附加blob并附加一些数据,模拟简单的日志记录操作。

from azure.storage.blob import AppendBlobService
append_blob_service = AppendBlobService(account_name='myaccount', account_key='mykey')

# The same containers can hold all types of blobs
append_blob_service.create_container('mycontainer')

# Append blobs must be created before they are appended to
append_blob_service.create_blob('mycontainer', 'myappendblob')
append_blob_service.append_blob_from_text('mycontainer', 'myappendblob', u'Hello, world!')

append_blob = append_blob_service.get_blob_to_text('mycontainer', 'myappendblob')

By Code问答

发表评论

电子邮件地址不会被公开。 必填项已用*标注

7 + 2 =