Boto3 S3,按最后修改时间排序存储桶

2024-05-14 00:09:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我知道你可以通过awscli:

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

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

我好像看不懂怎么用Boto3做这个。

我现在正在提取所有的文件,然后进行排序…但这似乎太过分了,尤其是如果我只关心最近10个左右的文件。

过滤系统似乎只接受s3的前缀,而不接受其他前缀。


Tags: 文件项目aws列表objectss3bucket排序
3条回答

我对@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]

如果bucket中的对象不多,可以使用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)]

看来用boto3是不行的。根据文档,boto3只支持以下收集方法:

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

希望这对你有所帮助。 https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.ServiceResource.buckets

相关问题 更多 >