Python 操作 Azure Blob Storage

前端之家收集整理的这篇文章主要介绍了Python 操作 Azure Blob Storage前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

》一文中介绍了 Azure Blob Storage 的基本概念,并通过 C# 代码展示了如何进行基本的操作。最近笔者需要在 Linux 系统中做类似的事情,于是决定使用 Azure 提供的 Azure Storage SDK for Python 来操作 Blob Storage。这样今后无论在 Windows 上还是 Linux上,都用 Python 就可以了。对 Azure Blob Storage 概念还不太熟悉的同学请先参考

@H_502_5@

pip install azure-storage @H_403_11@

代码安装它,请参考

查看代码操作的结果:

上传文件@H_502_5@

文件上传到刚才创建的 Blob Container 中。Azure SDK 为我们提供了下面四个方法

create_blob_from_path 上传指定路径的文件 create_blob_from_stream 内容上传 create_blob_from_bytes 上传一个 bype 数组。 create_blob_from_text 上传字符串。 @H_403_11@

方法的名字中都没有 upload 字眼,而是使用了 create。这也说明上传文件的本质是在云端创建一个 Blob 对象。

azure.storage.blob azure.storage.blob mystoragename = <span style="color: #800000">"<span style="color: #800000">xxxx<span style="color: #800000">"<span style="color: #000000">
mystoragekey
= <span style="color: #800000">"
<span style="color: #800000">yyyy<span style="color: #800000">"<span style="color: #000000">
blob_service = BlockBlobService(account_name=mystoragename,account_key=<span style="color: #000000">mystoragekey)

blob_service.create_blob_from_path(
<span style="color: #800000">'<span style="color: #800000">nickcon<span style="color: #800000">'<span style="color: #000000">,<span style="color: #800000">'<span style="color: #800000">myblobcortana.jpg<span style="color: #800000">'<span style="color: #000000">,<span style="color: #800000">'<span style="color: #800000">cortana-wallpaper.jpg<span style="color: #800000">'<span style="color: #000000">,content_settings=ContentSettings(contenttype=<span style="color: #800000">'<span style="color: #800000">image/jpg<span style="color: #800000">'))
@H
403_11@

文件的类型。注意 create_blob_from_path 方法的第二个参数,我们需要为新的 blob 对象指定一个名字。第一个参数是目标 Container, 第三个参数是要上传的本地文件路径。执行上面的脚本,会把本地的一张壁纸 cortana-wallpaper.jpg 上传到 Azure Blob Container 中:

名称已经不是源文件名称了,而是我们指定的 myblobcortana.jpg。

@H_502_5@

文件都有对应的 URL,这是 Azure Blob Storage 的默认策略。为的是我们可以从任何地方通过 URL 来访问这些文件。比如 myblobcortana.jpg 文件的 URL 为:

错误是合理的。否则任何人都能看到我保存的文件内容,隐私何在?还会有人为 Azure Blob Storage 付费吗?事情的真相是这样的,默认情况下我们创建的 Blob Container 和 Blob 对象都是私有的,也就是必须通过账号和 access key 才能访问。如果你要想让内容变成大家都能访问的公共资源,可以在创建时指定为 PublicAccess。也可以在创建完成后修改它的属性为 PublicAccess。下面我们把 nickcon Container 设置为 PublicAccess:

azure.storage.blob azure.storage.blob mystoragename = <span style="color: #800000">"<span style="color: #800000">xxxx<span style="color: #800000">"<span style="color: #000000">
mystoragekey
= <span style="color: #800000">"
<span style="color: #800000">yyyy<span style="color: #800000">"<span style="color: #000000">
blob_service = BlockBlobService(account_name=mystoragename,account_key=<span style="color: #000000">mystoragekey)

blob_service.set_container_acl(<span style="color: #800000">'<span style="color: #800000">nickcon<span style="color: #800000">',publicaccess=PublicAccess.Container)
@H
403_11@

调用 set_container_acl 方法修改 Container 的访问权限。试试重新刷新一下网页:

文件@H_502_5@

文件是很重要的操作,当然我们可以轻松的完成:

generator = blob_service.list_blobs( blob (blob.name) @H_403_11@

方法可以获得 Container 中的所有 Blob 对象。上面的代码打印了所有 Blob 对象的名称

@H_502_5@

方法可以下载 Blob 对象。简单期间我们只演示 get_blob_to_path 方法,其它的用法类似:

blob_service.get_blob_to_path(,,) @H_403_11@

名称,第三个参数为保存到本地文件的路径。

删除 Blob 对象@H_502_5@

删除,代码很简单,不再啰嗦:

blob_service.delete_blob(,) @H_403_11@

文件@H_502_5@

代码会把一个 Azure Storage Account 中的所有 Blob Container 中的内容备份到本地磁盘上:

azure.storage.blob mystoragename = <span style="color: #800000">"<span style="color: #800000">xxxx<span style="color: #800000">"<span style="color: #000000">
mystoragekey
= <span style="color: #800000">"<span style="color: #800000">yyyy<span style="color: #800000">"<span style="color: #000000">
blob_service = BlockBlobService(account_name=mystoragename,account_key=<span style="color: #000000">mystoragekey)

<span style="color: #008000">#<span style="color: #008000"> 下载一个 Blob Container 中的所有文件
<span style="color: #0000ff">def<span style="color: #000000"> downloadFilesInContainer(blobContainName):
generator =<span style="color: #000000"> blob_service.list_blobs(blobContainName)
<span style="color: #0000ff">for blob <span style="color: #0000ff">in<span style="color: #000000"> generator:
<span style="color: #008000">#<span style="color: #008000"> 获得 Blob 文件的目录路径
blobDirName =<span style="color: #000000"> os.path.dirname(blob.name)
<span style="color: #008000">#<span style="color: #008000"> 把 Blob Container 的名称添加为一级目录
newBlobDirName =<span style="color: #000000"> os.path.join(blobContainName,blobDirName)
<span style="color: #008000">#<span style="color: #008000"> 检查文件目录是否存在,不存在就创建
<span style="color: #0000ff">if <span style="color: #0000ff">not<span style="color: #000000"> os.path.exists(newBlobDirName):
os.makedirs(newBlobDirName)
localFileName =<span style="color: #000000"> os.path.join(blobContainName,blob.name)
blob_service.get_blob_to_path(blobContainName,blob.name,localFileName)

<span style="color: #008000">#<span style="color: #008000"> 获得用户所有的 Blob Container
containerGenerator =<span style="color: #000000"> blob_service.listcontainers()
<span style="color: #0000ff">for con <span style="color: #0000ff">in<span style="color: #000000"> containerGenerator:
downloadFilesInContainer(con.name)
@H
403_11@

文件在 container 中的目录。比如一个文件在 Blob Container 中的路径为 abc/test.txt,那么它的 blog.name 就是 abc/test.txt。要保持文件在 Blob Container 的名称及路径就要在本地创建对应的目录结构。

@H_502_5@

文件的功能。由于微软把相关接口封装的很清晰,所以代码非常的简短。使用 Python 的好处是可以在不同的平台上运行相同的代码。当你需要在不同的操作系统中做同样的事情时,这可太棒了!

猜你在找的Azure相关文章