web-dev-qa-db-ja.com

Boto3 S3、最終更新順にバケットをソート

Boto3を使用してS3からアイテムのリストを取得する必要がありますが、デフォルトのソート順(降順)を返す代わりに、逆順でそれを返します。

私はあなたがawscli経由でそれを行うことができることを知っています:

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

uIコンソール経由で実行可能(これがクライアント側で実行されるかサーバー側で実行されるかは不明)

Boto3でこれを行う方法はわかりません。

私は現在、すべてのファイルを取得してからソートしています...しかし、特に10個ほどの最新のファイルだけを気にしている場合、それはやり過ぎのようです。

フィルターシステムは、s3のプレフィックスのみを受け入れるように見えます。

12
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]
6
nate

バケットに多くのオブジェクトがない場合は、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)]
13
helloV

boto3を使用してソートを行う方法はないようです。ドキュメントによると、boto3はコレクションに対して次のメソッドのみをサポートしています。

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

これが何らかの形で役立つことを願っています。 https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.ServiceResource.buckets

2
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

これにより、すべてのキーがソートされた順序で取得されます

0
Israelsofer

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」を追加してソート順を変更できます。

0
Nelson