如何在python中使用Azure Blob存储

概述:

Azure Blob Storage是在云上将非结构化数据存储为对象或者blob形式。Blob存储可以存任何形式的文本或二进制数据,比如:文档、媒体文件或者app(应用程序安装包)。Blob存储也可以当成对象存储。

这篇文章将会演示使用Blob存储的常见场景。这个例子使用python写的,并且使用了Microsoft Azure Storage SDK for Python.这个场景包括上传、展示、下载和删除blobs。

Blob存储是什么?

Azure Blob存储是一种存储大量非结构化对象数据的服务,比如文本、二进制数据,可以从世界上的任何地方通过HTTP或HTTPS访问。你可以通过Blob存储向整个世界开放自己的数据,也可以单独为自己存储应用程序数据。

Blob存储的常用方法包括:

  • 直接向浏览器提供图片或文件
  • 提供分布式访问文件Storage Resource Provider Client Library For .NET
  • 流媒体音频和视频
  • 存储数据的备份和恢复、故障恢复和归档
  • 通过本地或azure托管服务方便于分析存储数据

Blob存储的思想

Blob存储包括以下几个组成部分:

帐号、容器、blob(数据)

Storage Account(存储帐号):所有访问Azure Storage是通过一个存储帐号进行的。这个存储帐号可以是一个通用存储账户或者一个Blob存储帐号(专门用来存储对象、blobs)。更多关于存储帐号的详细信息,见Azure storage account

容器:一个容器提供一组blobs的集合。所有的blobs必须置于一个容器中。一个帐号可以包含一个不限数量的容器。一个容器可以存储不限数量的blobs。注意:容器名必须要小写。

Blob(二进制大对象):一个任意类型和大小的文件。Azure Storage提供三种blobs类型:block blobs(块)、page blobs(页)、append blobs(附加)。

block blobs(块对象)非常适合存储文本或二进制文件,比如文档和媒体文件。Append blobs(附加对象)与block blobs相似,因为他们由块组成,但他们是附加操作的优化,因此,他们在日志场景中很有用。一个单一的块blob或append blob可以包含50000个,且每个达到4M,总大小可以超过195G(4M*50000)。

Page blobs可以达到1T大小,且在频繁的读写上显得更加有效。Azure虚拟机使用page blobs作为操作系统和数据硬盘。

更多关于命名容器和blobs的细节,见: Naming and Referencing Containers, Blobs, and Metadata.

创建一个Azure存储帐号

创建你首个Azure存储帐号的最简单方式是使用Azure Portal。了解详情,见Create a storage account

你也可以通过使用Azure PowerShellAzure CLI或者Storage Resource Provider Client Library for .NET

如果你暂时不想创建帐号,也可以使用Azure storage模拟帐号并在本地环境下测试代码。更多信息,见Use the Azure Storage Emulator for Development and Testing

创建容器

基于你想要使用的二进制文档对象类型,创建一个BlockBlobService、AppendBlobService或者PageBlobService对象。以下代码使用了一个BlockBlobService对象。将以下代码放在每个你想要通过编程方式访问Azure Block Blob Storage的Python文件顶端附近。

from azure.storage.blob import BlockBlobService

以下代码使用存储帐号名和key创建了一个BlockBlobService对象。使用你的帐号和key替换myaccount和mykey。

block_blob_service = BlockBlobService(account_name='myaccount', account_key='mykey')
Azure Storage中的每个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名称,可用以下规则来确认:

1.容器名必须以字母或数字开头,且只能包含字母、数字和(-)分隔符。

2.每个分隔符(-)只能在前面,字母和数字在后面;不能连续使用分隔符。

3.所有容器中的字母必须小写。

4.容器名必须有3-63个字符组成。

注意:

容器名必须小写,如果你包含了大写字母,或者违反了容器命名规则,你将收到400错误。

下面的示例代码中,你可以使用BlockBlobService创建一个不存在的容器。

block_blob_service.create_container('mycontainer')
默认情况下,新创建的容器是私有的,因此,在你从容器中下载blobs之前必须将帐号key列入说明。如果你想让每个人都能访问容器中的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)
修改后,网络上的每个人可以看到公开的容器中的blob文件,但只有你可以修改或删除他们。

上传blob文件到容器中


为了创建一个block blob并上传数据,有4中方法:使用路径、使用流、字节、文本。它们是执行超过64MB数据组块的高级方法。
create_blob_from_path从单独的路径上传文件目录,create_blob_from_stream从一个单独打开的文件或流上传目录,create_blob_from_bytes上传一组字节数组,而create_blob_from_text使用单独的编码(默认utf-8)上传文本值。
下面的例子上传了sunset.png目录文件到myblob存储中。

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,使用list_blobs方法。这个方法返回一个生成器。以下代码输出容器中每个blob存储的名字到控制台。

generator = block_blob_service.list_blobs('mycontainer')
for blob in generator:
    print(blob.name)
下载存储文件

为了从blob存储中下载存储数据,使用get_blob_to_path、get_blob_to_stream、get_blob_to_bytes或者get_blob_to_text方法。它们是执行超过64MB数据组块的高级方法。

下面的例子示范了使用get_blob_to_path方法来下载mublob存储下的目录并将其存为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存储适用于追加操作,例如日志。与块存储一样,append blob由块组成,但是当你向append blob中追加一个块时,它总是在末尾添加。你无法更新或删除append blob中已经存在的块。block Id不能被暴露体现他们是block blob。
每个append block可以是不同的大小,上限是4MB,并且一个append blob可以存储最多50000个块。append blob最大大小可以略超过195GB(4MB*50000)。

下面的例子创建一个新的append 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')

注:

        16年翻译的,当时没提交,csdn老是报错,现在Azure官方有自己的中文页了,阿西吧。不过也算是自己的劳动结果吧。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值