Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Boto3 S3,按上次修改的排序桶_Python_Python 3.x_Amazon Web Services_Amazon S3_Boto3 - Fatal编程技术网

Python Boto3 S3,按上次修改的排序桶

Python Boto3 S3,按上次修改的排序桶,python,python-3.x,amazon-web-services,amazon-s3,boto3,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中做到这一点 我目前正在获取所有文件,然后进行排序…但这似乎有些过

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

我知道您可以通过awscli完成:

aws s3api list-objects --bucket mybucketfoo --query "reverse(sort_by(Contents,&LastModified))"
它可以通过UI控制台实现,但不确定这是在客户端还是服务器端完成的

我似乎不知道如何在Boto3中做到这一点

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


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

似乎无法使用boto3进行排序。根据文档,boto3仅支持以下收集方法:

全部,过滤器**kwargs,页面大小**kwargs,限制**kwargs

希望这对你有所帮助。

如果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)]

我对@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]
这将按排序顺序获得所有键

s3=bot3.客户端's3' get_last_modified=lambda obj:intobj['LastModified']。strftime“%Y%m%d%H%m%S” def sortFindLatestbucket_名称: resp=s3.list\u objectsBucket=bucket\u name 如果resp中有“内容”: objs=resp['Contents'] files=sortedobjs,key=get\u last\u modified 对于输入文件: file=key['key'] cx=s3.get\u objectBucket=bucket\u name,Key=file
我可以按日期和时间进行排序。我正在使用Python3 AWS lambda。您的里程可能会有所不同。它可以被优化,我故意使它离散化。如前一篇文章所述,可以添加“reverse=True”来更改排序顺序

一种更简单的方法,使用python3排序函数:

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)

现在,您有了一个反向排序列表,按每个列表的“last_modified”属性排序

上述各项略有改善:

import boto3

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)]

要获取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]

您可以获取所有对象,获取其上次修改的日期,并根据日期对其进行排序。检查一下这个,S3API不支持以这种方式列出。CLI和控制台可能会获取所有内容,然后执行排序。您正在将数据返回到Python中,因此只需对返回的数据进行排序。没有必要让boto3帮你做这件事——这只是Python的一行额外代码。@JohnRotenstein问题在于复杂性。为什么要获取N条记录,然后对N条记录进行排序以获取所需的集合Z,而您可以要求AWS最初仅返回Z集合?和我不想从表中选择*的原因相同。然后循环查找其中的X=1。您可以使用子流程模块运行支持按日期排序的aws cli api。list_objects_v2最多返回1000个对象,如果您的桶中包含的内容超过1000个,则上述内容将不适用work@Tomer这就是为什么我在bucketi中没有太多对象的情况下,要将“LastModified”转换为string,然后转换为in,我会添加免责声明?这似乎也很管用:get_last_modified=lambda obj:obj['LastModified']@helloV但是首先有理由将日期格式化为字符串吗?直接比较datetime对象似乎有效。显然不赞成使用%s。您可以使用.timestamp代替:[0:9]做什么?@VikrantGoel将其从0过滤到9,从而获得阵列的一个子集警告:虽然您希望获得最后的X个对象,但在该解决方案中,您仍将获得存储桶中的所有对象,这可能会导致巨大的成本,特别是如果您每次都运行此操作。
files = [obj.key for obj in sorted(files, key=lambda x: x.last_modified,
    reverse=True)][0:2]