Boto3を使用してS3からアイテムのリストを取得する必要がありますが、デフォルトのソート順(降順)を返す代わりに、逆順でそれを返します。
私はあなたがawscli経由でそれを行うことができることを知っています:
aws s3api list-objects --bucket mybucketfoo --query "reverse(sort_by(Contents,&LastModified))"
uIコンソール経由で実行可能(これがクライアント側で実行されるかサーバー側で実行されるかは不明)
Boto3でこれを行う方法はわかりません。
私は現在、すべてのファイルを取得してからソートしています...しかし、特に10個ほどの最新のファイルだけを気にしている場合、それはやり過ぎのようです。
フィルターシステムは、s3のプレフィックスのみを受け入れるように見えます。
以下に@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]
バケットに多くのオブジェクトがない場合は、Pythonを使用して必要に応じてソートできます。
ラムダを定義して、最終変更時刻を取得します。
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
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
これにより、すべてのキーがソートされた順序で取得されます
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」を追加してソート順を変更できます。