如何列出S3存储桶分隔符路径

时间:2018-10-05 17:26:20

标签: python amazon-s3 delimiter

如何列出S3存储桶分隔符路径?

基本上,我想列出s3存储桶中的所有“目录”和/或“子目录”。我知道这些实际上并不存在。基本上,我希望所有包含定界符的对象,然后只返回定界符之前的键路径。以前缀开头会更好,但在存储桶级别就足够了。

示例S3存储桶:

root.json
/2018/cats/fluffy.png
/2018/cats/gary.png
/2018/dogs/rover.png
/2018/dogs/jax.png

然后我想做类似的事情:

s3_client = boto3.client('s3')
s3_client.list_objects(only_show_delimiter_paths=True)

结果

/2018/
/2018/cats/
/2018/dogs/

我看不出有什么办法可以使用https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.list_objects

我可以提取所有对象名称,并在我的应用程序代码中执行此操作,但这似乎效率很低。

1 个答案:

答案 0 :(得分:0)

boto3中的Amazon S3页面具有this example

  

列出Amazon S3存储桶中的顶级通用前缀

     

此示例显示如何列出Am​​azon S3存储桶中的所有顶级通用前缀:

import boto3

client = boto3.client('s3')
paginator = client.get_paginator('list_objects')
result = paginator.paginate(Bucket='my-bucket', Delimiter='/')
for prefix in result.search('CommonPrefixes'):
    print(prefix.get('Prefix'))

但是,它仅显示顶级前缀。

因此,这是一些代码来打印所有“文件夹”:

import boto3

client = boto3.client('s3')
objects = client.list_objects_v2(Bucket='my-bucket')

keys = [o['Key'] for o in objects['Contents']]

folders = {k[:k.rfind('/')+1] for k in keys if k.rfind('/') != -1}

print ('\n'.join(folders))