Python 如何使用boto3检索文件系统样式中的bucket前缀

Python 如何使用boto3检索文件系统样式中的bucket前缀,python,amazon-web-services,amazon-s3,boto,boto3,Python,Amazon Web Services,Amazon S3,Boto,Boto3,执行以下操作: s3 = boto3.resource('s3') bucket = s3.Bucket('a_dummy_bucket') bucket.objects.all() 将返回“a_dummy_bucket”bucket下的所有对象,如: test1/blah/blah/afile45645.zip test1/blah/blah/afile23411.zip test1/blah/blah/afile23411.zip [...] 2500 files test2/blah/b

执行以下操作:

s3 = boto3.resource('s3')
bucket = s3.Bucket('a_dummy_bucket')
bucket.objects.all()
将返回“a_dummy_bucket”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
在这种情况下,有没有办法得到“test1”、“test2”、“test3”等等。。。没有对所有结果进行分页? 为了达到“test2”,我需要3个分页调用,每个调用有1000个键来知道有一个“test2”,然后其他3个调用有1000个键来达到“test3”,以此类推

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

谢谢

我相信你可能正在寻找的就是得到这份工作。使用此示例可以完成以下操作:

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'))
关于常用前缀,说明如下:

只有在指定分隔符时,响应才能包含公共前缀。执行此操作时,CommonPrefixes包含前缀和分隔符指定的下一个字符串之间的所有键(如果有)。实际上,CommonPrefixes列出的键与Prefix指定的目录中的子目录类似。例如,如果前缀为notes/且分隔符为斜杠(/),则在notes/summer/july中,常用前缀为notes/summer/。在计算返回数时,在公共前缀中汇总的所有键都作为单个返回计数。请参阅MaxKeys

类型:字符串

祖先:ListBucketResult


没有办法摆脱分页。您可以指定小于默认页面大小1000,但不能超过1000。如果您认为分页和查找前缀很麻烦,请尝试AWS CLI—它在内部为您执行所有分页,但只提供您想要的结果

aws s3 ls s3://a_dummy_bucket/
          PRE test1/
          PRE test2/
          PRE test3/

问题明确地说,
不使用分页
好吧,我并不是试图避免分页,只是为了执行最小数量的调用。没有分页就无法得到你想要的。不,你不能。因为S3首先不是典型的文件系统。编写一个脚本,让它为您过滤。因此,拥有数百万个文件使我可以遍历所有这些文件……S3文档已经提到它是一个对象存储。意味着您需要处理数据库中的索引或文件或其他内容。Aws确实在S3 bucket中提供了事件触发器,让您在bucket上完成某些活动时发送信息。是的,我知道触发,但这超出了我想要实现的范围。但是谢谢。helloV评论道:关于为您进行分页的AWS cli。我想,当水桶很大的时候,他会打几百个电话,不是吗?所以他们必须这样做。好吧,这可以工作,但是我需要从我的应用程序执行外部命令并解析输出。