Boto3:仅从S3资源中获取所选对象

mar*_*tin 8 python amazon-s3 amazon-web-services boto3

我可以通过获取和读取AWS S3存储桶中的所有对象

s3 = boto3.resource('s3')
    bucket = s3.Bucket('my-bucket')
    all_objs = bucket.objects.all()
    for obj in all_objs:
        pass
        #filter only the objects I need
Run Code Online (Sandbox Code Playgroud)

然后

obj.key
Run Code Online (Sandbox Code Playgroud)

会给我一条路径.

有没有办法事先过滤那些尊重某个起始路径(存储桶中的目录)的文件,这样我就可以避免遍历所有对象并在以后过滤?

Ilj*_*ilä 24

使用filter[1],[2]等集合方法,如bucket.

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
objs = bucket.objects.filter(Prefix='myprefix')
for obj in objs:
    pass
Run Code Online (Sandbox Code Playgroud)

  • 这是否需要像“list_objects”那样分页,或者它返回无限的结果? (2认同)

Gru*_*Gru 7

对于使用boto3.client('s3')而不是 的人boto3.resource('s3'),您可以使用 'Prefix' 键来过滤 s3 存储桶中的对象

import boto3

s3 = boto3.client('s3')

params = {
    "Bucket": "HelloWorldBucket",
    "Prefix": "Happy"
}

happy_objects = s3.list_objects_v2(**params)

Run Code Online (Sandbox Code Playgroud)

上面的代码片段将获取“HelloWorldBucket”中“Happy”文件夹中的所有文件。

PS:s3 中的文件夹只是一个构造,并作为文件/对象名称的前缀实现。