本文介绍如何通过 ListObject 列举指定桶下的所有对象、指定前缀文件、指定目录下的文件和子目录。
tos:ListBucket
权限,具体操作,请参见 IAM 策略概述。参数 | 描述 |
---|---|
prefix | 本次查询结果的前缀。 |
delimiter | 对对象名称进行分组的字符。 |
marker | 列举对象的起始位置。设定从该值之后按字母排序返回对象列表。通常为上次请求返回的 next_marker 值。 |
max_keys | 返回列举对象的最大数,默认 1000。 |
以下代码用于列举指定桶中的 10 个对象。
import os
import tos
# 从环境变量获取 AK 和 SK 信息。
ak = os.getenv('TOS_ACCESS_KEY')
sk = os.getenv('TOS_SECRET_KEY')
# your endpoint 和 your region 填写Bucket 所在区域对应的Endpoint。# 以华北2(北京)为例,your endpoint 填写 tos-cn-beijing.volces.com,your region 填写 cn-beijing。
endpoint = "your endpoint"
region = "your region"
bucket_name = "bucket-test"
try:
# 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现
client = tos.TosClientV2(ak, sk, endpoint, region)
# 列举桶中的10个文件示例代码如下:
result = client.list_objects(bucket_name, max_keys=10)
for item in result.contents:
print(item.key)
except tos.exceptions.TosClientError as e:
# 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常
print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause))
except tos.exceptions.TosServerError as e:
# 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息
print('fail with server error, code: {}'.format(e.code))
# request id 可定位具体问题,强烈建议日志中保存
print('error with request id: {}'.format(e.request_id))
print('error with message: {}'.format(e.message))
print('error with http code: {}'.format(e.status_code))
print('error with ec: {}'.format(e.ec))
print('error with request url: {}'.format(e.request_url))
except Exception as e:
print('fail with unknown error: {}'.format(e))
以下代码用于分页列举桶 bucket-test
中的对象。
import os
import tos
# 从环境变量获取 AK 和 SK 信息。
ak = os.getenv('TOS_ACCESS_KEY')
sk = os.getenv('TOS_SECRET_KEY')
# your endpoint 和 your region 填写Bucket 所在区域对应的Endpoint。# 以华北2(北京)为例,your endpoint 填写 tos-cn-beijing.volces.com,your region 填写 cn-beijing。
endpoint = "your endpoint"
region = "your region"
bucket_name = "bucket-test"
try:
client = tos.TosClientV2(ak, sk, endpoint, region)
# 分页列举桶中前1000个对象
result = client.list_objects(bucket_name)
for item in result.contents:
print(item.key)
# 分页列举后续1000个对象
if result.is_truncated:
result = client.list_objects(bucket_name, marker=result.next_marker)
for item in result.contents:
print(item.key)
except tos.exceptions.TosClientError as e:
# 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常
print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause))
except tos.exceptions.TosServerError as e:
# 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息
print('fail with server error, code: {}'.format(e.code))
# request id 可定位具体问题,强烈建议日志中保存
print('error with request id: {}'.format(e.request_id))
print('error with message: {}'.format(e.message))
print('error with http code: {}'.format(e.status_code))
print('error with ec: {}'.format(e.ec))
print('error with request url: {}'.format(e.request_url))
except Exception as e:
print('fail with unknown error: {}'.format(e))
以下代码用于列举桶 bucket-test
指定前缀的所有对象。
import os
import tos
# 从环境变量获取 AK 和 SK 信息。
ak = os.getenv('TOS_ACCESS_KEY')
sk = os.getenv('TOS_SECRET_KEY')
endpoint = "your endpoint"
region = "your region"
bucket_name = 'bucket-test'
prefix = "your prefix"
try:
# 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现
client = tos.TosClientV2(ak, sk, endpoint, region)
is_truncated = True
marker = ""
# 列举指定前缀的所有对象
while is_truncated:
result = client.list_objects(bucket_name, prefix=prefix, marker=marker)
for item in result.contents:
print(item.key)
is_truncated = result.is_truncated
marker = result.next_marker
except tos.exceptions.TosClientError as e:
# 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常
print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause))
except tos.exceptions.TosServerError as e:
# 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息
print('fail with server error, code: {}'.format(e.code))
# request id 可定位具体问题,强烈建议日志中保存
print('error with request id: {}'.format(e.request_id))
print('error with message: {}'.format(e.message))
print('error with http code: {}'.format(e.status_code))
print('error with ec: {}'.format(e.ec))
print('error with request url: {}'.format(e.request_url))
except Exception as e:
print('fail with unknown error: {}'.format(e))
以下代码用于列举指定桶 bucket-test
中所有对象。
import os
import tos
# 从环境变量获取 AK 和 SK 信息。
ak = os.getenv('TOS_ACCESS_KEY')
sk = os.getenv('TOS_SECRET_KEY')
endpoint = "your endpoint"
region = "your region"
bucket_name = 'bucket-test'
try:
# 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现
client = tos.TosClientV2(ak, sk, endpoint, region)
# 列举指定桶下所有对象
truncated = True
marker = ''
while truncated:
result = client.list_objects(bucket_name, marker=marker)
for item in result.contents:
print(item.key)
truncated = result.is_truncated
marker = result.next_marker
except tos.exceptions.TosClientError as e:
# 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常
print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause))
except tos.exceptions.TosServerError as e:
# 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息
print('fail with server error, code: {}'.format(e.code))
# request id 可定位具体问题,强烈建议日志中保存
print('error with request id: {}'.format(e.request_id))
print('error with message: {}'.format(e.message))
print('error with http code: {}'.format(e.status_code))
print('error with ec: {}'.format(e.ec))
print('error with request url: {}'.format(e.request_url))
except Exception as e:
print('fail with unknown error: {}'.format(e))
TOS 只有对象的概念, 可通过创建一个大小为0并且以斜线 / 结尾的对象, 模拟目录的功能.
通过 delimiter
和 prefix
两个参数可以模拟目录的功能:
delimiter
为 /
同时设置 prefix
为空, 可返回根目录下的对象和子目录信息。delimiter
为 /
同时设置 prefix
为子目录, 可返回子目录的对象和次级目录。以下代码用于列举桶 bucket-test
指定目录下的对象和子目录。
import os
import tos
# 从环境变量获取 AK 和 SK 信息。
ak = os.getenv('TOS_ACCESS_KEY')
sk = os.getenv('TOS_SECRET_KEY')
endpoint = "your endpoint"
region = "your region"
bucket_name = 'bucket-test'
try:
# 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现
client = tos.TosClientV2(ak, sk, endpoint, region)
# 向Bucket中添加fun1、fun2、fun3 的子目录与名为test的文件
client.put_object(bucket_name, "fun1/")
client.put_object(bucket_name, "fun1/test/")
client.put_object(bucket_name, "fun1/obj.txt")
client.put_object(bucket_name, "fun2/")
client.put_object(bucket_name, "fun3/")
client.put_object(bucket_name, "test")
# 列举根目录下的文件夹和文件
marker = ''
is_truncated = True
while is_truncated:
out = client.list_objects(bucket_name, delimiter="/", marker=marker)
# common_prefixes中返回了根目录下的子目录
for prefix in out.common_prefixes:
print('subDir', prefix.prefix)
# contents中返回了根目录下的对象
for content in out.contents:
print('file', content.key)
is_truncated = out.is_truncated
marker = out.next_marker
# 列举 fun1/ 目录下的文件和对象
marker = ''
is_truncated = True
while is_truncated:
out = client.list_objects(bucket_name, delimiter="/", prefix='fun1/', marker=marker)
# common_prefixes中返回了根目录下的子目录
for prefix in out.common_prefixes:
print('subDir', prefix.prefix)
# contents中返回了根目录下的对象
for content in out.contents:
print('file', content.key)
is_truncated = out.is_truncated
marker = out.next_marker
except tos.exceptions.TosClientError as e:
# 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常
print('fail with client error, message:{}, cause: {}'.format(e.message, e.cause))
except tos.exceptions.TosServerError as e:
# 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息
print('fail with server error, code: {}'.format(e.code))
# request id 可定位具体问题,强烈建议日志中保存
print('error with request id: {}'.format(e.request_id))
print('error with message: {}'.format(e.message))
print('error with http code: {}'.format(e.status_code))
print('error with ec: {}'.format(e.ec))
print('error with request url: {}'.format(e.request_url))
except Exception as e:
print('fail with unknown error: {}'.format(e))
关于列举对象的 API 文档,请参见 ListObjects。