Python操作Azure Blob Storage

news2024/11/18 20:22:53

安装 Azure Storage SDK for Python

最简单的方式是在安装了 python 和 pip 的机器上直接执行下面的命令:

pip install azure-storage

安装完成后通过 pip freeze 命令查看安装的版本:

由于 Azure Storage SDK for Python 是一个开源项目,所以你也可以通过源代码安装它

创建 Blob Container

由于任何一个 Blob 都必须包含在一个 Blob Container 中,所以我们的第一个任务是创建 Blob Container。
SDK 为我们提供了一个名为 BlockBlobService 的对象。通过这个对象我们可以创建并操作 Blob Container。下面的代码创建一个名为"nickcon" 的 Container:

代码本身很简单,其中的 account_name 和 account_key 是你的 storage 账号及其访问 key。我们使用 GUI 工具 Microsoft Azure Storage Explorer 查看代码操作的结果:

名为 nickcon 的 Blob Container 已经被成功的创建了。

上传文件

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

create_blob_from_path #上传指定路径的文件。
create_blob_from_stream #把一个数据流中的内容上传。
create_blob_from_bytes #上传一个 bype 数组。
create_blob_from_text #使用特定的编码格式上传字符串。

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

from azure.storage.blob import BlockBlobService
from azure.storage.blob import ContentSettings

mystoragename = "xxxx"
mystoragekey = "yyyy"
blob_service = BlockBlobService(account_name=mystoragename, account_key=mystoragekey)

blob_service.create_blob_from_path(
    'nickcon',
    'myblobcortana.jpg',
    'cortana-wallpaper.jpg',
    content_settings=ContentSettings(content_type='image/jpg'))

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

在 Container 中创建的 Blob 对象的名称已经不是源文件的名称了,而是我们指定的 myblobcortana.jpg。

控制访问权限

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

https://nickpsdk.blob.core.windows.net/nickcon/myblobcortana.jpg
直接把这个地址粘贴到浏览器的地址栏里:

啊哦,尴尬了,收到了一个无情的 error!

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

from azure.storage.blob import BlockBlobService
from azure.storage.blob import PublicAccess

mystoragename = "xxxx"
mystoragekey = "yyyy"
blob_service = BlockBlobService(account_name=mystoragename, account_key=mystoragekey)

blob_service.set_container_acl('nickcon', public_access=PublicAccess.Container)

此处 import 了 PublicAccess 类型,并调用 set_container_acl 方法来修改 Container 的访问权限。试试重新刷新一下网页:

此时就不要再往你的 Blob Container 中放隐私照了哦!

列出 Blob Container 中的所有文件

检查 Container 中都有哪些文件是很重要的操作,当然我们可以轻松的完成:

generator = blob_service.list_blobs('nickcon')
for blob in generator:
print(blob.name)

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

下载 Blob 对象

和创建 Blob 对象一样,也有四个方法可以下载 Blob 对象。简单期间我们只演示 get_blob_to_path 方法,其它的用法类似:

blob_service.get_blob_to_path('nickcon', 'myblobcortana.jpg', 'newimage.png')

其中第二个参数为 Container 中 Blob 对象的名称,第三个参数为保存到本地文件的路径。

删除 Blob 对象

有创建自然有删除,代码很简单,不再啰嗦:

blob_service.delete_blob('nickcon', 'myblobcortana.jpg')

备份 Blob Container 中的文件

是的,你没听错!
我们相信云存储的安全性,但把重要的数据备份到其它的存储上也是需要的。下面的代码会把一个 Azure Storage Account 中的所有 Blob Container 中的内容备份到本地磁盘上:

from azure.storage.blob import BlockBlobService
import os

mystoragename = "xxxx"
mystoragekey = "yyyy"
blob_service = BlockBlobService(account_name=mystoragename, account_key=mystoragekey)

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

# 获得用户所有的 Blob Container
containerGenerator = blob_service.list_containers()
for con in containerGenerator:
    downloadFilesInContainer(con.name)

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Buildroot系列开发(七)block device

摘自:百问网 文章目录1.块设备2.1 什么是块设备?raw flash?2.2 block device 列表2.3 块设备分区2.4 传输数据到块设备2. 块设备文件系统2.1 支持的块设备文件系统2.2 linux / unix 其他日志文件系统2.3 F2FS2.4 SquashFS2.5 如何选择最佳文件…

计算机网络-转发表和路由选择协议

有志者,事竟成 文章目录一、描述1、转发表和路由选择协议二、总结一、描述 1、转发表和路由选择协议 前面我们说过,路由器从与它相连的一条通信链路得到分组,然后向与它相连的另一条通信链路转发该分组。但是路由器怎样决定它应当向哪条链路…

Docker[4]-Docker数据卷

数据卷 前面我们介绍了镜像和容器,通过镜像我们可以启动多个容器,但是我们发现当我们的容器停止获取删除后,我们在容器中的应用的一些数据也丢失了,这时为了解决容器的数据持久化,我们需要通过容器数据卷来解决这个问…

一文4000字教你如何使用可视化的Docker进行UI自动化测试

随着 docker 的发展,很多测试的同学也已经在测试工作上使用 dockr 作为环境基础去进行一些自动化测试,这篇文章主要讲述我们在 docker 中使用浏览器进行自动化测试如果可以实现可视化,同时可以对浏览器进行相关的操作。 开篇 首先我们先了解…

【C++学习笔记】C++编程环境配置

g跟gcc之间是否有依赖关系 g跟gcc之间没有依赖关系,两者分别对应面向C和C语言的编译程序,关于gcc和g的区别,请参考知乎回答《gcc和g是什么关系? ——gcc 和 g 的区别》 1 Ubuntu环境配置 Ubuntu官方源提供gcc和g预编译版本 Ub…

用一张图说一说 ChatGPT 内部技术工作流程

前沿 这几天ChatGPT可谓是热火朝天,很多同事和朋友都来找到勇哥,说能不能说一说相关话题,但是之前几天勇哥都在默默的干一件大事情,今天终于成型、有结果了,所有就抽了点时间来和大家一起聊聊ChatGPT背后的技术&#…

.net开发安卓入门 - 布局与样式(像素单位px、dp、sp的区别)

.net开发安卓入门 - 布局与样式布局LinearLayoutRelativeLayoutTableLayoutRecyclerViewListViewGridViewGridLayoutTabbed Layouts主题 Material Theme主题应用程序主题活动像素pxdpdipsp常用UI框架推荐常用动画推荐布局 布局用于排列构成屏幕的 UI 界面的元素 (,…

没有公网IP,怎样远程查看视频监控?

视频监控通常被称作“第三只眼”。如今,除了最基础的安防需求外,视频监控在不同的应用场景延伸出了各种各样的功能需求,并且正与日俱增。 常见的家庭应用场景,如照看老人小孩、宠物等;常见的公司应用场景,如…

vue的script动态改css、scss变量方法

解决场景&#xff1a;script设颜色变量&#xff0c;<style>的background-color的值"#ddd"的跟着变 序 1、这篇博文适用vue2和vue3版本&#xff0c;博主实验时&#xff0c;vue3的版本是^3.2.45 2、 其实要解决的方案在vue3里有一个专栏“单文件组件的 <…

[附源码]Python计算机毕业设计Django志愿者服务平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

3分钟带你重温 SelectDB 产品发布会亮点!

12月8日的 SelectDB 产品发布会圆满举办&#xff0c;一时间吸引了无数业内关注&#xff0c;大家都对这款在正式发布前就拿下 ClickBench 全球第一的云数仓产品充满期待与好奇。万众瞩目下&#xff0c;SelectDB Cloud 终于正式与大家见面了~~ 以下是这场发布会的详细解读&#…

蜂鸟E203学习笔记(五)——执行

1.1 执行概述 1.1.1 指令译码 指令所包含的信息编码在有限长度的指令字中&#xff0c;信息如下&#xff1a; 指令所需要读取的操作数寄存器索引指令需要写回的寄存器索引指令的其他信息如指令类型、指令的操作信息等 顺便注意&#xff1a;并非所有的处理器流水线都会在译码…

MySQL进阶篇(二) - 索引

一、索引概述&#xff08;P66&#xff09; 1. 介绍 索引&#xff08;index&#xff09;是帮助 MySQL 高效获取数据的数据结构&#xff08;有序&#xff09;。 在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&…

浅析Python中的struct模块

最近在学习python网络编程这一块&#xff0c;在写简单的socket通信代码时&#xff0c;遇到了struct这个模块的使用&#xff0c;当时不太清楚这到底有和作用&#xff0c;后来查阅了相关资料大概了解了&#xff0c;在这里做一下简单的总结。 了解c语言的人&#xff0c;一定会知道…

同花顺Python量化交易接口有什么功能?

为了进一步满足私募机构“本地化交易接口”的诉求&#xff0c;“同花顺Python量化交易接口”就出现了&#xff0c;目前仅支持同花顺模拟资金账户&#xff0c;您可以在本地对模拟资金账户进行下单、撤单、资产查询、委托查询等操作&#xff01;那么同花顺Python量化交易接口可以…

如何实现随机生成坐标点,并且使每个坐标点之间的距离大于某个距离?(用于散点图的绘制,进行数据的处理)

背景&#xff1a; 最近需要开发一个新需求&#xff0c;需要绘制一个随机生成数字的散点图&#xff0c;要求点与点的距离要大于某个特定值。 解决思路&#xff1a; 通过循环获取每个坐标点&#xff0c;每获取一个新的坐标点&#xff0c;都要与之前生成的坐标点进行对比&#…

为你揭秘保健品平台利用“消费全返”,半年净赚过百万背后的原因

​大家好&#xff0c;我是每天分享电商模式咨询的林工&#xff0c;最近林工了解到某一家保健品企业&#xff0c;利用做会员招商活动一招“消费全返”的商业模式&#xff0c;在短短半年内裂变近数十万会员&#xff0c;净挣过百万营业额&#xff0c;这个模式值得各行各业的企业家…

Python实战案例,tkinter+random模块,实现课堂随机抽选提问并语音播报学生姓名

前言 今天给大家介绍Python实现课堂随机抽选提问并语音播报学生姓名实战案例&#xff0c;废话不多说直接开整~ 开发工具 Python版本&#xff1a; 3.8 相关模块&#xff1a; tkinter模块 time模块 random模块 环境搭建 安装Python并添加到环境变量&#xff0c;pip安装需…

计算机毕业设计ssm+vue基本微信小程序的琴房管理系统 uniapp 小程序

项目介绍 随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具,钢琴培训企业各种管理系统层出不穷,为钢琴培训企业琴房管理开发必要的系统,能够有效的提升管理效率。一直以来,钢琴培训企业琴房预约一直没有进行系统化的管理,学生无…

sharing-jdbc-1-5.x版本应用

1总结 2&#xff1a;详解 运行模式 :: ShardingSphere 用户手册&#xff0c;开发手册。这俩比较重要 spring.shardingsphere.mode.type 默认内存模式 3官网案例 不同的依赖坐标&#xff0c;配置方式不一样。按照官网的配置来一步一步配置。 4 整合springboot方式 行表达式 :…