Boto3:仅从 S3 资源中抓取选定的对象

Boto3: grabbing only selected objects from the S3 resource

我可以通过

抓取和读取我的 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

然后

obj.key

会给我桶内的路径。

有没有办法预先过滤那些符合特定起始路径(存储桶中的目录)的文件,这样我就可以避免循环遍历所有对象并在以后过滤?

使用filter[1], [2]类的收集方法,如bucket。

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

如果我们只需要 object-keys 的列表,那么 bucket.objects.filter 是 list_objects 或 list_object_v2 的更好替代方案,因为这些函数有 1000 个对象的限制。参考:list_objects_v2

对于使用 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)

以上代码片段将获取 'HelloWorldBucket' 中 'Happy' 文件夹中的所有文件。

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