9
A
答えて
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))