2017-06-15 22 views
4

Boto3を使用してS3からアイテムのリストを取得する必要がありますが、デフォルトのソート順(降順)を返す代わりに、逆順で返すようにします。Boto3 S3、バケットを最後に変更したとき

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

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

とUIコンソール(これは、クライアント側またはサーバー側で行われているかどうかわからない)

を経由してそのなんとか私はどのように見ているようだカントBoto3でこれを行う。

現在、すべてのファイルをフェッチしていますが、ソートしていますが、残念ながら、特に10個ほどの最新ファイルしか気にしていないと、残念です。

フィルタシステムは、s3のプレフィックスのみを受け入れるようですが、それ以外のものはありません。

+0

すべてのオブジェクトを取得し、最後に変更した日付を取得し、日付に基づいて並べ替えることができます。この[質問]をチェックしてください(https://stackoverflow.com/questions/9679344/how-can-i-get-last-modified-datetime-of-s3-objects-with-boto) – cookiedough

+0

S3 APIはサポートしていませんこのようにリストされます。 CLI(とおそらくコンソール)はすべてを取り出し、並べ替えを実行します。 –

+0

データをPythonに戻すので、返されたデータを単純に並べ替えます。 boto3にあなたのためにそれをさせる必要はありません - それはPythonの余分な行です。 –

答えて

1

私は@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] 
1

私はあなたのユースケースを理解できます。 aws s3コマンドで簡単に実行できます。

例えば: AWS S3 LS testing1-goreplay --recursive

それはあなたのために働くなら、私に教えてください。

2

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

は、私はこの変化をした...というわけではない私が最適と思われるもの: 'get_last_modified =ラムダOBJ:int型(obj.last_modified.strftime( '%s' の))' 'ファイル= [OBJ。ソートされた(ソートされていないキー= get_last_modified、逆= True)のオブジェクトのキー] [0:9] ' – nate

関連する問題