Boto3 S3,按上次修改对桶进行排序

新手上路,请多包涵

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

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

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

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

我似乎看不到如何在 Boto3 中执行此操作。

我目前正在获取所有文件,然后进行排序……但这似乎有些过分,尤其是当我只关心 10 个左右的最新文件时。

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

原文由 nate 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 510
2 个回答

我对下面发布的@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]

原文由 nate 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 helloV 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题