2015-09-05 8 views
9

Как я использую, чтобы превратить коллекцию в список и запрос длины:Как получить размер коллекции boto3?

s3 = boto3.resource('s3') 
bucket = s3.Bucket('my_bucket') 
size = len(list(bucket.objects.all())) 

Однако это силы разрешения всей коллекции и устраняет преимущество использования Коллекции в первой очереди. Есть лучший способ сделать это?

ответ

17

Невозможно получить количество ключей в ковше без перечисления всех объектов, это ограничение AWS S3 (см. https://forums.aws.amazon.com/thread.jspa?messageID=164220).

Получение Сводки объектов (голова) не получить фактические данные, поэтому должны быть относительно недорогой операцией, и если вы просто отбрасывая список, то вы могли бы сделать:

size = sum(1 for _ in bucket.objects.all()) 

который даст вам количество объектов без создания списка.

0

Заимствование из similar question, один из вариантов получения полного списка ключей объектов из префикса bucket + используется для использования рекурсии с помощью метода 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)) 

 Смежные вопросы

  • Нет связанных вопросов^_^