Boto3 S3,按最后修改排序桶

时间:2017-06-15 18:32:16

标签: python python-3.x amazon-web-services amazon-s3 boto3

我需要使用Boto3从S3获取项目列表,但不是返回默认排序顺序(降序),而是希望它通过相反的顺序返回。

我知道你可以通过awscli来做到这一点:

aws s3api list-objects --bucket mybucketfoo --query "reverse(sort_by(Contents,&LastModified))"

通过UI控制台可以实现(不确定这是在客户端还是服务器端完成)

我似乎无法在Boto3中看到如何做到这一点。

我目前正在获取所有文件,然后排序......但这似乎有些过分,特别是如果我只关心10个左右的最新文件。

过滤系统似乎只接受s3的前缀,没有别的。

8 个答案:

答案 0 :(得分:9)

如果存储桶中的对象不多,您可以使用Python根据需要对其进行排序。

定义lambda以获得最后修改时间:

get_last_modified = lambda obj: int(obj['LastModified'].strftime('%s'))

获取所有对象并按上次修改时间对其进行排序。

s3 = boto3.client('s3')
objs = s3.list_objects_v2(Bucket='my_bucket')['Contents']
[obj['Key'] for obj in sorted(objs, key=get_last_modified)]

如果您想要撤消排序:

[obj['Key'] for obj in sorted(objs, key=get_last_modified, reverse=True)]

答案 1 :(得分:5)

我对@helloV在下面发布的内容做了一些变化。它不是100%最优,但它完成了boto3到目前为止的限制。

s3 = boto3.resource('s3')
my_bucket = s3.Bucket('myBucket')
unsorted = []
for file in my_bucket.objects.filter():
   unsorted.append(file)

files = [obj.key for obj in sorted(unsorted, key=get_last_modified, 
    reverse=True)][0:9]

答案 2 :(得分:2)

似乎无法通过使用boto3进行排序。根据文档,boto3仅支持这些集合方法:

all(), filter(**kwargs), page_size(**kwargs), limit(**kwargs)

希望以某种方式提供帮助。 https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.ServiceResource.buckets

答案 3 :(得分:1)

keys = []

kwargs = {'Bucket': 'my_bucket'}
while True:
    resp = s3.list_objects_v2(**kwargs)
    for obj in resp['Contents']:
        keys.append(obj['Key'])

    try:
        kwargs['ContinuationToken'] = resp['NextContinuationToken']
    except KeyError:
        break

这将按排序顺序为您提供所有键

答案 4 :(得分:1)

获取 S3 文件夹中最后修改的文件:

import boto3

s3 = boto3.resource('s3')
my_bucket = s3.Bucket('bucket_name')
files = my_bucket.objects.filter(Prefix='folder_name/subfolder_name/')
files = [obj.key for obj in sorted(files, key=lambda x: x.last_modified,
    reverse=True)][0:2]

print(files)

获取最后修改的两个文件:

files = [obj.key for obj in sorted(files, key=lambda x: x.last_modified,
    reverse=True)][0:2]

答案 5 :(得分:0)


s3 = boto3.client('s3')

get_last_modified = lambda obj: int(obj['LastModified'].strftime('%Y%m%d%H%M%S'))

def sortFindLatest(bucket_name):
    resp = s3.list_objects(Bucket=bucket_name)
    if 'Contents' in resp:
        objs = resp['Contents']
        files = sorted(objs, key=get_last_modified)
        for key in files:
            file = key['Key']
            cx = s3.get_object(Bucket=bucket_name, Key=file)

这对我来说可以按日期和时间进行排序。我正在使用Python3 AWS lambda。你的旅费可能会改变。可以对其进行优化,我故意将其离散化。如先前的文章所述,可以添加“ reverse = True”来更改排序顺序。

答案 6 :(得分:0)

使用python3 sorted()函数的一种更简单的方法:

import boto3
s3 = boto3.resource('s3')

myBucket = s3.Bucket('name')

def obj_last_modified(myobj):
    return myobj.last_modified

sortedObjects = sorted(myBucket.objects.all(), key=obj_last_modified, reverse=True)

您现在有了一个反向排序的列表,该列表按每个Object的'last_modified'属性排序。

答案 7 :(得分:0)

以上有一些改进:

s3 = boto3.resource('s3')
my_bucket = s3.Bucket('myBucket')
files = my_bucket.objects.filter():
files = [obj.key for obj in sorted(files, key=lambda x: x.last_modified, 
    reverse=True)]