基本概念
桶
桶类似于容器,用于存储数据,在 OBS 中文件和文件夹统称为对象。
在一个桶中,最好存放统一使用目的的文件
对象
文件和文件夹统一称为对象
AK
access key id 用于 SDK 或使用客户端登录时的用户确认,类似于账号的用户名。
SK
secret key 用于 SDK 或使用客户端登录时的用户确认,类似于账号的密码。
ENDPOINT
endpoint 终端,表示 obs 的连接地址。
上述三个信息在桶的信息列表中有详细的展示。
python SDK
python SDK 的安装
pip install esdk-obs-python --trusted-host pypi.org
OBS 的连接
obs 操作首先需要获取 obs 的连接,如下所示
AK='HITIWZBYABHYGELMEUG5'
SK='guDwqhHZjxPb881A5pAkOjQj4fpZHAqSLdml73xF'
obs_endpoint='obs.cn-south-278.aipcc-gz.com'
obsClient = ObsClient(AK, SK,server=obs_endpoint)
在拿到 obs 之后,可以通过 obsClient 对象,对 obs 中的文件进行操作。
OBS 获取对象列表
#设置文件所在OBS桶
bucketName='cornell-dataset'
# bucketName='vk-dataset'
mark = None
length = 0
file_path = []
while True:
# 获取对象列表,一次最大可获取1000,通过设置mark进行多于1000个对象的对象列表获取
resp = obsClient.listObjects(bucketName, marker=mark, max_keys=1000)
if resp.status < 300:
# 对象信息在resp.body.contents中
length += len(resp.body.contents)
for file in resp.body.contents:
file_path.append(file.key)
if resp.body.is_truncated is True:
# 上述条件成立,表明还未完整获取到对象列表
mark = resp.body.next_marker
else:
break
else:
# 异常处理
print('errorCode:', resp.errorCode)
print('errorMessage:', resp.errorMessage)
for file in file_path:
if file.endswith('/'):
print(f"删除{file}")
file_path.remove(file)
print(len(file_path))
print(file_path)
OBS 下载图片
try:
print("正在获取文件")
resp = obsClient.getObject(bucketName, '01/pcd0100r.png', downloadPath=None, )
# bucketName: 桶的名称
# objectkey: 对象的名称
# downloadPath: 下载路径,如果不进行保存,填入None。
#如果需要保存,则填入保存路径:'./tmp.png'
if resp.status < 300:
response = resp.body.response
chunk_size = 65536 # 一次性拉取文件的大小。
data = b'' # 数据存储在该变量中。
if response is not None:
while True:
chunk = response.read(chunk_size)
if not chunk:
break
data += chunk
response.close()
from PIL import Image
import io
# 转化图像数据
image = Image.open(io.BytesIO(data))
import matplotlib.pyplot as plt
plt.imshow(img)
plt.show()
print("获取文件完成")
except:
import traceback
print(traceback.format_exc())