作者:刘延庚 | 来源:互联网 | 2023-02-01 10:28
我需要使用Boto3从S3获取项目列表,但不是返回默认排序顺序(降序),而是希望它通过反向顺序返回它.
我知道你可以通过awscli来做到这一点:
aws s3api list-objects --bucket mybucketfoo --query "reverse(sort_by(Contents,&LastModified))"
并通过UI控制台实现(不确定这是完成客户端还是服务器端)
我似乎无法在Boto3中看到如何做到这一点.
我目前正在获取所有文件,然后排序......但这似乎有点过头了,特别是如果我只关心10个左右的最新文件.
过滤系统似乎只接受s3的前缀,没有别的.
1> helloV..:
如果存储桶中没有多个对象,则可以使用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)]
list_objects_v2最多返回1000个对象,如果您的存储桶包含超过1000个,则上述操作将无效
@Tomer这就是我放弃免责声明的原因`如果桶里没有多少物品
2> nate..:
我对@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]