2015-09-05 3 views

答えて

17

すべてのオブジェクトを一覧表示せずにバケット内のキーの数を取得する方法はありませんが、これはAWS S3の制限です(https://forums.aws.amazon.com/thread.jspa?messageID=164220を参照)。

オブジェクトの概要(HEAD)を取得すると、実際のデータは非常に比較的安価な操作であるべきで、あなただけのリストを破棄しているならば、あなたが行うことができます取得していません:

あなたを与えるだろう
size = sum(1 for _ in bucket.objects.all()) 

リストを構成しないオブジェクトの数。

0

similar questionから借用すると、バケット+接頭辞からオブジェクトキーの完全なリストを取得する1つの方法は、list_objects_v2メソッドで再帰を使用することです。

このメソッドは、オブジェクトキー、1000キーのリストを一度に再帰的に取得します。

list_objects_v2への各要求は、前回の要求の最後のキーの後にキーをリスト表示し続けるために、引数StartAfterを使用します。

import boto3 

if __name__ == '__main__': 

    client = boto3.client('s3', 
     aws_access_key_id  = 'access_key', 
     aws_secret_access_key = 'secret_key' 
    ) 

    def get_all_object_keys(bucket, prefix, start_after = '', keys = []): 
     response = client.list_objects_v2(
      Bucket  = bucket, 
      Prefix  = prefix, 
      StartAfter = start_after 
     ) 

     if 'Contents' not in response: 
      return keys 

     key_list = response['Contents'] 
     last_key = key_list[-1]['Key'] 

     keys.extend(key_list) 

     return get_all_object_keys(bucket, prefix, last_key, keys) 

    object_keys = get_all_object_keys('your_bucket', 'prefix/to/files') 

    print(len(object_keys))