2014年9月2日星期二

如何从 Python 使用 Blob 存储服务

本指南将演示如何使用 Windows Azure Blob 存储服务执行常见任务。相关示例是使用 Python API 编写的。涉及的任务包括上载列出下载删除 Blob。有关 Blob 的详细信息,请参阅后续步骤一节。

目录

创建 Windows Azure 存储帐户

如何:创建容器

注意:如果您需要安装 Python 或客户端库,请参阅 Python 安装指南
通过 BlobService 对象,可以使用容器和 Blob。以下代码创建 BlobService 对象。将以下代码添加到您希望在其中以编程方式访问 Windows Azure 存储的任何 Python 文件的顶部附近:
from azure.storage import *
以下代码使用存储帐户名称和帐户密钥创建 BlobService 对象。使用实际帐户和密钥替换“myaccount”和“mykey”。
blob_service = BlobService(account_name='myaccount', account_key='mykey')
所有存储 Blob 都驻留在一个容器中。如果该容器不存在,可以使用 BlobService 对象来创建它:
blob_service.create_container('mycontainer')
默认情况下,新容器是专用容器,因此您必须指定存储访问密钥(已在上面完成此操作)才能从该容器下载 Blob。如果您要让容器中的文件可供所有人使用,则可以使用以下代码创建容器并传递公共访问级别:
blob_service.create_container('mycontainer', x_ms_blob_public_access='container')
或者,也可以在创建容器后使用以下代码修改该容器:
blob_service.set_container_acl('mycontainer', x_ms_blob_public_access='container')
在此更改后,Internet 上的任何人都可以查看公共容器中的 Blob,但只有您可以修改或删除它们。

如何:将 Blob 上载到容器

若要将文件上载到 Blob,请使用 put_blob 方法来创建该 Blob,以便将文件流用作 Blob 的内容。首先创建名为 task1.txt 的文件(任意内容即可),然后将它存储在您的 Python 文件所在的目录中。
myblob = open(r'task1.txt', 'r').read()
blob_service.put_blob('mycontainer', 'myblob', myblob, x_ms_blob_type='BlockBlob')

如何:列出容器中的 Blob

若要列出容器中的 Blob,请使用带 for 循环的 list_blobs 方法来显示容器中每个 Blob 的名称。以下代码将容器中每个 Blob 的名称url 输出到控制台。
blobs = blob_service.list_blobs('mycontainer')
for blob in blobs:
    print(blob.name)
    print(blob.url)

如何:下载 Blob

若要下载 Blob,请使用 get_blob 方法将 Blob 内容传输到稍后可以保存到本地文件的流对象。
blob = blob_service.get_blob('mycontainer', 'myblob')
with open(r'out-task1.txt', 'w') as f:
    f.write(blob)

如何:删除 Blob

最后,若要删除 Blob,请调用 delete_blob
blob_service.delete_blob('mycontainer', 'myblob')

如何:上载和下载大型 Blob

块 Blob 的最大大小为 200 GB。对于小于 64 MB 的 Blob,可以通过调用一次 put_blob 或 get_blob 来上载或下载 Blob,如前所述。对于大于 64 MB 的 Blob,需要以 4 MB 或更小的块的形式上载或下载 Blob。
以下代码演示用于上载或下载任意大小的块 Blob 的函数示例。
import base64

chunk_size = 4 * 1024 * 1024

def upload(blob_service, container_name, blob_name, file_path):
    blob_service.create_container(container_name, None, None, False)
    blob_service.put_blob(container_name, blob_name, '', 'BlockBlob')

    block_ids = []
    index = 0
    with open(file_path, 'rb') as f:
        while True:
            data = f.read(chunk_size)
            if data:
                length = len(data)
                block_id = base64.b64encode(str(index))
                blob_service.put_block(container_name, blob_name, data, block_id)
                block_ids.append(block_id)
                index += 1
            else:
                break

    blob_service.put_block_list(container_name, blob_name, block_ids)

def download(blob_service, container_name, blob_name, file_path):
    props = blob_service.get_blob_properties(container_name, blob_name)
    blob_size = int(props['content-length'])

    index = 0
    with open(file_path, 'wb') as f:
        while index < blob_size:
            chunk_range = 'bytes={}-{}'.format(index, index + chunk_size - 1)
            data = blob_service.get_blob(container_name, blob_name, x_ms_range=chunk_range)
            length = len(data)
            index += length
            if length > 0:
                f.write(data)
                if length < chunk_size:
                    break
            else:
                break
如果您需要大于 200 GB 的 Blob,则可以使用页 Blob 代替块 Blob。页 Blob 的最大大小为 1 TB,其中的页与 512 字节页边界对齐。使用 put_blob 可创建页 Blob,使用 put_page 可向其中写入内容,而使用 get_blob 可从中读取内容。

后续步骤

现在,您已了解有关 Blob 存储的基础知识,单击下面的链接可了解如何执行更复杂的存储任务。

没有评论:

发表评论