如何通过 Python 使用 Azure Blob 存储

概述

Azure Blob 存储是一种将非结构化数据作为对象/Blob 存储在云中的服务。 Blob 存储可以存储任何类型的文本或二进制数据,例如文档、媒体文件或应用程序安装程序。 Blob 存储也称为对象存储。

本指南将演示如何使用 Blob 存储执行常见方案。 这些示例用 Python 编写并使用 Azure Storage SDK for Python。 涉及的任务包括上传、列出、下载和删除 Blob。

什么是 Blob 存储

Azure Blob 存储是用于存储大量非结构化对象数据(例如文本或二进制数据)的服务,这些数据可通过 HTTP 或 HTTPS 从世界各地进行访问。 你可以使用 Blob 存储向外公开数据,或者私下存储应用程序数据。

Blob 存储的常见用途包括:

  • 直接向浏览器提供图像或文档
  • 存储文件以供分布式访问
  • 对视频和音频进行流式处理
  • 存储数据以用于备份和还原、灾难恢复及存档
  • 存储数据以供本地或 Azure 托管服务执行分析

Blob 服务概念

Blob 服务包含以下组件:

Blob 体系结构

  • 存储帐户: 对 Azure 存储服务的所有访问都要通过存储帐户来完成。 此存储帐户可以是常规用途存储帐户,也可以是专用于存储对象/Blob 的 Blob 存储帐户。 有关详细信息,请参阅关于 Azure 存储帐户
  • 容器: 一个容器包含一组 blob 集。 所有 blob 必须位于相应的容器中。 一个帐户可以包含无限个容器。 一个容器可以存储无限个 Blob。 请注意,容器名称必须小写。
  • Blob: 任何类型和大小的文件。 Azure 存储提供三种类型的 Blob:块 Blob、页 Blob 和追加 Blob。

    块 Blob 特别适用于存储短的文本或二进制文件,例如文档和媒体文件。 追加 Blob 类似于块 Blob,因为它们是由块组成的,但针对追加操作对它们进行了优化,因此它们适用于日志记录方案。 单个块 Blob 可以包含最多 50000 个块,每个块最大 100 MB,总大小稍微大于 4.75 TB (100 MB X 50000)。 单个追加 Blob 可以包含最多 50000 个块,每个块最大 4 MB,总大小稍微大于 195 GB (4 MB X 50000)。

    页 Blob 最大可达 1 TB 大小,并且对于频繁的读/写操作更加高效。 Azure 虚拟机使用页 Blob 作为 OS 和数据磁盘。

    有关命名容器和 Blob 的详细信息,请参阅 命名和引用容器、Blob 和元数据

创建 Azure 存储帐户

创建第一个 Azure 存储帐户的最简单方法是使用 Azure 门户。 若要了解更多信息,请参阅 创建存储帐户

还可使用 Azure PowerShellAzure CLI适用于 .NET 的存储资源提供程序客户端库创建 Azure 存储帐户。

如果暂时不想创建存储帐户,也可以使用 Azure 存储模拟器在本地环境中运行和测试代码。 有关详细信息,请参阅 使用 Azure 存储模拟器进行开发和测试

创建容器

根据要使用的 Blob 的类型,创建 BlockBlobServiceAppendBlobServicePageBlobService 对象。 以下代码使用 BlockBlobService 对象。 在希望在其中以编程方式访问 Azure 块 Blob 存储的任何 Python 文件中,将以下代码添加到文件的顶部附近。

from azure.storage.blob import BlockBlobService

以下代码使用存储帐户名称和帐户密钥创建一个 BlockBlobService 对象。 使用帐户名称和密钥替换“myaccount”和“mykey”。

block_blob_service = BlockBlobService(account_name='myaccount', account_key='mykey', endpoint_suffix='core.chinacloudapi.cn')

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

https://storagesample.blob.core.chinacloudapi.cn/mycontainer/blob1.txt
https://storagesample.blob.core.chinacloudapi.cn/mycontainer/photos/myphoto.jpg

容器名称必须是有效的 DNS 名称,并符合以下命名规则:

  1. 容器名称必须以字母或数字开头,并且只能包含字母、数字和短划线 (-) 字符。
  2. 每个短划线 (-) 字符的前面和后面都必须是一个字母或数字;在容器名称中不允许连续的短划线 (-)。
  3. 容器名称中的所有字母都必须为小写。
  4. 容器名称必须介于 3 到 63 个字符。
Important

请注意,容器的名称必须始终为小写。 如果你在容器名称中包括大写字母或以其他方式违反了容器命名规则,则可能会收到 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_pathcreate_blob_from_streamcreate_blob_from_bytescreate_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_pathget_blob_to_streamget_blob_to_bytesget_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

追加 Blob 针对追加操作(例如日志记录)进行了优化。 类似于块 Blob,追加 Blob 由块组成,但是当你将新的块添加到追加 Blob 时,始终追加到该 Blob 的末尾。 你不能更新或删除追加 Blob 中现有的块。 追加 Blob 的块 ID 不公开,因为它们是用于一个块 Blob 的。

追加 Blob 中的每个块可以有不同的大小,最大为 4 MB,并且追加 Blob 最多可包含 50000 个块。 因此,追加 Blob 的最大大小稍微大于 195 GB(4 MB X 50000 块)。

下面的示例创建一个新的追加 Blob 并向其追加某些数据,模拟一个简单的日志记录操作。

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

# 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')

后续步骤

在了解了 Blob 存储的基础知识后,可单击下面的链接了解详细信息。