阿里云对象存储OSS的使用笔记

官方地址:

https://www.alibabacloud.com/help/zh/oss/developer-reference/manage-directories-3


0 初始化bucket

旧版本OSS

import oss2

#endpoint = 'https://oss-cn-shanghai-internal.aliyuncs.com' #  Suppose that your bucket is in the Hangzhou region.
endpoint = 'oss-cn-shanghai.aliyuncs.com' 
endpoint = 'oss-cn-shanghai-internal.aliyuncs.com' #  Suppose that your bucket is in the Hangzhou region.

auth = oss2.Auth('Accesskey ID', ' Aceesskey Screct')
bucket = oss2.Bucket(auth, endpoint, 'Bucket Name')

其中有几个要素

新版本V4:

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请先配置环境变量。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'yourEndpoint'
# 填写Endpoint对应的Region信息,例如cn-hangzhou。
region = 'cn-hangzhou'

# 填写Bucket名称。
bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region) 

其中EnvironmentVariableCredentialsProvider这里需要在Linux环境先进行配置(Python配置访问凭证)

还可以直接代码配置,但是阿里云文档提示并不推荐,是因为容易泄露账号与密码:

# -*- coding: utf-8 -*-
import oss2

# 填写从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
sts_access_key_id = 'OSS_ACCESS_KEY_ID'
sts_access_key_secret = 'OSS_ACCESS_KEY_SECRET'
# 填写从STS服务获取的安全令牌(SecurityToken)。
security_token = 'OSS_SESSION_TOKEN'
# 使用临时访问凭证中的认证信息初始化StsAuth实例。
auth = oss2.StsAuth(sts_access_key_id,
                    sts_access_key_secret,
                    security_token)

1 上传文件

来自:https://www.alibabacloud.com/help/zh/oss/developer-reference/simple-upload-1?spm=a2c63.p38356.0.0.5706672arYIdvz

# -*- coding: utf-8 -*-
import oss2
import os
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# 必须以二进制的方式打开文件。
# 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
with open('D:\\localpath\\examplefile.txt', 'rb') as fileobj:
    # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。
    fileobj.seek(1000, os.SEEK_SET)
    # Tell方法用于返回当前位置。
    current = fileobj.tell()
    # 填写Object完整路径。Object完整路径中不能包含Bucket名称。
    bucket.put_object('exampleobject.txt', fileobj)

Python SDK还提供了更便捷的方法用于上传本地文件。

# 填写Object完整路径和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
# 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
bucket.put_object_from_file('exampleobject.txt', 'D:\\localpath\\examplefile.txt')

2 下载文件

来自:https://www.alibabacloud.com/help/zh/oss/developer-reference/download-objects-as-files-1?spm=a2c63.p38356.0.0.56c043feCNOUvO

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Endpoint以杭州为例,其它Region请按实际情况填写。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# 填写Object完整路径,完整路径中不包含Bucket名称,例如testfolder/exampleobject.txt。
# 下载Object到本地文件,并保存到指定的本地路径D:\\localpath\\examplefile.txt。如果指定的本地文件存在会覆盖,不存在则新建。
bucket.get_object_to_file('testfolder/exampleobject.txt', 'D:\\localpath\\examplefile.txt')        

3 创建、删除文件

3.1 创建目录

来自:

https://www.alibabacloud.com/help/zh/oss/developer-reference/manage-directories-3

import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# 填写目录名称,目录需以正斜线结尾。
bucket.put_object('exampledir/', '')    

3.2 删除目录

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
prefix = "exampledir/"

# 删除目录及目录下的所有文件。
for obj in oss2.ObjectIterator(bucket, prefix=prefix):
    bucket.delete_object(obj.key)

4 其他

4.1 Python判断文件是否存在

来自:https://www.alibabacloud.com/help/zh/oss/developer-reference/determine-whether-an-object-exists?spm=a2c63.p38356.0.0.294e64c9VUUhz0

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填写存储空间名称。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')

# 填写Object的完整路径,Object完整路径中不能包含Bucket名称。
exist = bucket.object_exists('exampleobject.txt')
# 返回值为true表示文件存在,false表示文件不存在。
if exist:
    print('object exist')
else:
    print('object not exist')

4.2 遍历所有文件

来自:https://www.alibabacloud.com/help/zh/oss/developer-reference/list-objects-2?spm=a2c63.p38356.0.0.72bc1e69Xlnd88

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from itertools import islice

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 列举Bucket下的10个文件。
for b in islice(oss2.ObjectIterator(bucket), 10):
    print(b.key)

4.3 查询指定前缀的文件

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# 列举fun文件夹下的所有文件,包括子目录下的文件。
for obj in oss2.ObjectIterator(bucket, prefix='fun/'):
    print(obj.key)

4.4 列举指定目录下的文件和子目录

来自:https://www.alibabacloud.com/help/zh/oss/developer-reference/list-objects-2?spm=a2c63.p38356.0.0.72bc1e69Xlnd88

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# 列举fun文件夹下的文件与子文件夹名称,不列举子文件夹下的文件。
for obj in oss2.ObjectIterator(bucket, prefix = 'fun/', delimiter = '/'):
    # 通过is_prefix方法判断obj是否为文件夹。
    if obj.is_prefix():  # 判断obj为文件夹。
        print('directory: ' + obj.key)
    else:                # 判断obj为文件。
        print('file: ' + obj.key)

4.5 获取指定目录下的文件大小

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

def CalculateFolderLength(bucket, folder):
    length = 0
    for obj in oss2.ObjectIterator(bucket, prefix=folder):
        length += obj.size
    return length
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

for obj in oss2.ObjectIterator(bucket, delimiter='/'):
    if obj.is_prefix():  # 判断obj为文件夹。
        length = CalculateFolderLength(bucket, obj.key)
        print('directory: ' + obj.key + '  length:' + str(length) + "Byte.")
    else: # 判断obj为文件。
        print('file:' + obj.key + '  length:' + str(obj.size) + "Byte.")

4.6 删除单个文件

https://www.alibabacloud.com/help/zh/oss/developer-reference/delete-objects-2?spm=a2c63.p38356.0.0.2f445ebaD6QQyr

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# 删除文件。
# yourObjectName填写待删除文件的完整路径,完整路径中不包含Bucket名称,例如exampledir/exampleobject.txt。
# 如需删除文件夹,请将yourObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有文件删除后才能删除该文件夹。
bucket.delete_object('exampledir/exampleobject.txt')            

4.7 批量删除文件

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# 批量删除3个文件。每次最多删除1000个文件。
# 依次填写待删除的3个文件的完整路径,完整路径中不包含Bucket名称。
result = bucket.batch_delete_objects(['exampleobject1.jpg', 'testobject2.png', 'destobject3.txt'])
# 打印成功删除的文件名。
print('\n'.join(result.deleted_keys))            

4.8 删除指定前缀或目录下的多个文件

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 如果您需要删除所有前缀为src的文件,则prefix设置为src。设置为src后,所有前缀为src的非目录文件、src目录以及目录下的所有文件均会被删除。
prefix = 'src'
# 如果您仅需要删除src目录及目录下的所有文件,则prefix设置为src/。
# prefix = 'src/'

# 删除多个文件。
for obj in oss2.ObjectIterator(bucket, prefix=prefix):
    bucket.delete_object(obj.key)
相关推荐
樱木...1 分钟前
MySQL Crash 故障记录:Failing assertion: index->table->stat_initialized
数据库·mysql
D0ublecl1ck9 分钟前
初识 Django
数据库·python·django·sqlite
D0ublecl1ck12 分钟前
【实用向】Django 框架入门
数据库·后端·python·django
WeiComp18 分钟前
Android数据存储——文件存储、SharedPreferences、SQLite、Litepal
android·数据库·sqlite·litepal
小志biubiu25 分钟前
【C++11】可变参数模板/新的类功能/lambda/包装器--C++
开发语言·c++·笔记·学习·c++11·c11
做人求其滴28 分钟前
如何多人在同一个局域网下连接Mysql数据库?怎么将 MySQL 数据库共享给他人?保姆级教程idea,Navicat连接
数据库·学习·mysql·intellij-idea·idea
布说在见36 分钟前
我的创作之路:机缘、收获、日常与未来的憧憬
经验分享·笔记
PGCCC1 小时前
【PGCCC】Postgresql BRIN 索引原理
数据库·postgresql
Ljw...1 小时前
用户管理(MySQL)
数据库·mysql·用户管理
cnftv2 小时前
中国山水画在他这里暂停拐了个弯儿再重启
笔记·其他·生活·娱乐·媒体