如何使用boto3检索文件系统样式中的存储桶前缀

Pep*_*uis 2 python amazon-s3 boto amazon-web-services boto3

做类似以下的事情:

s3 = boto3.resource('s3')
bucket = s3.Bucket('a_dummy_bucket')
bucket.objects.all()
Run Code Online (Sandbox Code Playgroud)

将返回'a_dummy_bucket'桶下的所有对象,如:

test1/blah/blah/afile45645.zip
test1/blah/blah/afile23411.zip
test1/blah/blah/afile23411.zip
[...] 2500 files
test2/blah/blah/afile.zip
[...] 2500 files
test3/blah/blah/afile.zip
[...] 2500 files
Run Code Online (Sandbox Code Playgroud)

在这种情况下,是否有任何方法可以获得'test1','test2','test3'等...而不对所有结果进行分页?为了达到'test2',我需要3个分页调用,每个调用1000个密钥,知道有一个'test2',然后其他3个有1000个密钥来达到'test3',依此类推.

如何在不对所有结果进行分页的情况下获取所有这些前缀?

谢谢

Cor*_*hay 7

我相信获得通用前缀是你可能正在寻找的.使用此示例可以完成以下操作:

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'))
Run Code Online (Sandbox Code Playgroud)

AWS Documentation#Bucket.Get关于Common Prefixes的说明如下:

只有在指定分隔符时,响应才能包含CommonPrefixes.执行此操作时,CommonPrefixes包含Prefix与分隔符指定的下一个字符串之间的所有键(如果有).实际上,CommonPrefixes列出了与Prefix指定的目录中的子目录相同的键.例如,如果前缀是notes /并且分隔符是斜杠(/),则在notes/summer/july中,公共前缀是notes/summer /.在计算返回数时,在公共前缀中汇总的所有密钥都计为单个返回.见MaxKeys.

类型:字符串

祖先:ListBucketResult