文档首页 > > SDK参考> Python> 管理对象> 列举对象

列举对象

分享
更新时间: 2019/11/21 GMT+08:00

您可以通过ObsClient.listObjects列举出桶里的对象。

该接口可设置的参数如下:

参数

作用

prefix

限定返回的对象名必须带有prefix前缀。

marker

列举对象的起始位置,返回的对象列表将是对象名按照字典序排序后该参数以后的所有对象。

max_keys

列举对象的最大数目,取值范围为1~1000,当超出范围时,按照默认的1000进行处理。

delimiter

用于对对象名进行分组的字符。对于对象名中包含delimiter的对象,其对象名(如果请求中指定了prefix,则此处的对象名需要去掉prefix)中从首字符至第一个delimiter之间的字符串将作为一个分组并作为commonPrefix返回。

简单列举

以下代码展示如何简单列举对象,最多返回1000个对象:

# 引入模块
from obs import ObsClient
 
# 创建ObsClient实例
obsClient = ObsClient(
    access_key_id='*** Provide your Access Key ***',    
    secret_access_key='*** Provide your Secret Key ***',    
    server='https://your-endpoint'
)

resp = obsClient.listObjects('bucketname')

if resp.status < 300:
    print('requestId:', resp.requestId)
    index = 1    
    for content in resp.body.contents:        
        print('object [' + str(index) + ']')        
        print('key:', content.key)        
        print('owner_id:', content.owner.owner_id)        
        print('owner_name:', content.owner.owner_name)        
        index += 1
else:
    print('errorCode:', resp.errorCode)
    print('errorMessage:', resp.errorMessage)
  • 每次至多返回1000个对象,如果指定桶包含的对象数量大于1000,则返回结果中body.is_truncated为True表明本次没有返回全部段,并可通过body.next_marker获取下次列举的起始位置。
  • 如果想获取指定桶包含的所有对象,可以采用分页列举的方式。

指定数目列举

以下代码展示如何指定数目列举对象:

# 引入模块
from obs import ObsClient
 
# 创建ObsClient实例
obsClient = ObsClient(
    access_key_id='*** Provide your Access Key ***',    
    secret_access_key='*** Provide your Secret Key ***',    
    server='https://your-endpoint'
)

# 只列举100个对象
resp = obsClient.listObjects('bucketname', max_keys=100)

if resp.status < 300:
    print('requestId:', resp.requestId)
    index = 1    
    for content in resp.body.contents:        
        print('object [' + str(index) + ']')        
        print('key:', content.key)        
        print('owner_id:', content.owner.owner_id)        
        print('owner_name:', content.owner.owner_name)        
        index += 1
else:
    print('errorCode:', resp.errorCode)
    print('errorMessage:', resp.errorMessage)

指定前缀列举

以下代码展示如何指定前缀列举对象:

# 引入模块
from obs import ObsClient
 
# 创建ObsClient实例
obsClient = ObsClient(
    access_key_id='*** Provide your Access Key ***',    
    secret_access_key='*** Provide your Secret Key ***',    
    server='https://your-endpoint'
)

# 设置列举带有prefix前缀的100个对象
resp = obsClient.listObjects('bucketname', max_keys=100, prefix='prefix')

if resp.status < 300:
    print('requestId:', resp.requestId)
    index = 1    
    for content in resp.body.contents:        
        print('object [' + str(index) + ']')        
        print('key:', content.key)        
        print('owner_id:', content.owner.owner_id)        
        print('owner_name:', content.owner.owner_name)        
        index += 1
else:
    print('errorCode:', resp.errorCode)
    print('errorMessage:', resp.errorMessage)

指定起始位置列举

以下代码展示如何指定起始位置列举对象:

# 引入模块
from obs import ObsClient
 
# 创建ObsClient实例
obsClient = ObsClient(
    access_key_id='*** Provide your Access Key ***',    
    secret_access_key='*** Provide your Secret Key ***',    
    server='https://your-endpoint'
)

# 设置列举对象名字典序在"test"之后的100个对象
resp = obsClient.listObjects('bucketname', max_keys=100, marker='test')

if resp.status < 300:
    print('requestId:', resp.requestId)
    index = 1    
    for content in resp.body.contents:        
        print('object [' + str(index) + ']')        
        print('key:', content.key)        
        print('owner_id:', content.owner.owner_id)        
        print('owner_name:', content.owner.owner_name)        
        index += 1
else:
    print('errorCode:', resp.errorCode)
    print('errorMessage:', resp.errorMessage)

分页列举全部对象

以下代码展示分页列举全部对象:

# 引入模块
from obs import ObsClient
 
# 创建ObsClient实例
obsClient = ObsClient(
    access_key_id='*** Provide your Access Key ***',    
    secret_access_key='*** Provide your Secret Key ***',    
    server='https://your-endpoint'
)

# 设置每页100个对象
max_keys = 100
index = 1   
marker = None
while True:
    resp = obsClient.listObjects('bucketname', max_keys=max_keys, marker=marker)
    if resp.status < 300:
        print('requestId:', resp.requestId)
        for content in resp.body.contents:        
            print('object [' + str(index) + ']')        
            print('key:', content.key)        
            print('owner_id:', content.owner.owner_id)        
            print('owner_name:', content.owner.owner_name)        
            index += 1
        if not resp.body.is_truncated:
            break
        marker = resp.body.next_marker
    else:
        print('errorCode:', resp.errorCode)
        print('errorMessage:', resp.errorMessage)
        break

列举文件夹中的所有对象

OBS本身是没有文件夹的概念的,桶中存储的元素只有对象。文件夹对象实际上是一个大小为0且对象名以“/”结尾的对象,将这个文件夹对象名作为前缀,即可模拟列举文件夹中对象的功能。以下代码展示如何列举文件夹中的对象:

# 引入模块
from obs import ObsClient
 
# 创建ObsClient实例
obsClient = ObsClient(
    access_key_id='*** Provide your Access Key ***',    
    secret_access_key='*** Provide your Secret Key ***',    
    server='https://your-endpoint'
)

# 设置每页100个对象
max_keys = 100
index = 1   
marker = None
# 设置文件夹对象名"dir/"为前缀
prefix = 'dir/'
while True:
    resp = obsClient.listObjects('bucketname', max_keys=max_keys, marker=marker, prefix=prefix)
    if resp.status < 300:
        print('requestId:', resp.requestId)
        for content in resp.body.contents:        
            print('object [' + str(index) + ']')        
            print('key:', content.key)        
            print('owner_id:', content.owner.owner_id)        
            print('owner_name:', content.owner.owner_name)        
            index += 1
        if not resp.body.is_truncated:
            break
        marker = resp.body.next_marker
    else:
        print('errorCode:', resp.errorCode)
        print('errorMessage:', resp.errorMessage)
        break

按文件夹分组列举所有对象

以下代码展示如何按文件夹分组,列举桶内所有对象:

# 引入模块
from obs import ObsClient
 
# 创建ObsClient实例
obsClient = ObsClient(
    access_key_id='*** Provide your Access Key ***',    
    secret_access_key='*** Provide your Secret Key ***',    
    server='https://your-endpoint'
)

def listObjectsByPrefix(resp):
    for prefix in resp.body.commonPrefixs:
        subresp = obsClient.listObjects('bucketname', delimiter='/', prefix=prefix.prefix)
        if subresp .status < 300:
            print('Objects in folder [' + prefix.prefix + ']:')
            for content in subresp.body.contents:
                print('key:', content.key)        
                print('owner_id:', content.owner.owner_id)        
                print('owner_name:', content.owner.owner_name)       
            listObjectsByPrefix(subresp)
        else:
            print('errorCode:', resp.errorCode)
            print('errorMessage:', resp.errorMessage)

resp = obsClient.listObjects('bucketname', delimiter='/')
if resp.status < 300:
    print('Objects in the root directory:')
    for content in resp.body.contents:
        print('key:', content.key)        
        print('owner_id:', content.owner.owner_id)        
        print('owner_name:', content.owner.owner_name)       
    listObjectsByPrefix(resp)
else:
    print('errorCode:', resp.errorCode)
    print('errorMessage:', resp.errorMessage)
  • 以上代码示例没有考虑文件夹中对象数超过1000个的情况。
  • 由于是需要列举出文件夹中的对象和子文件夹,且文件夹对象总是以“/”结尾,因此delimiter总是为“/”。
  • 每次递归的返回结果中body.contents包含的是文件夹中的对象;body.commonPrefixs包含的是文件夹的子文件夹。
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区