2015-09-05 15 views
9

Sposób Używam jest przekształcenie Collection do listy i kwerendy długość:Jak mogę uzyskać rozmiar kolekcji Boto3?

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

jednak tę uchwałę siłami całej kolekcji i eliminuje korzyści wynikające z zastosowania kolekcję w pierwszej kolejności. Czy jest lepszy sposób to zrobić?

Odpowiedz

17

Nie ma sposobu na uzyskanie liczby kluczy w wiadrze bez wyszczególnienia wszystkich obiektów. Jest to ograniczenie AWS S3 (patrz https://forums.aws.amazon.com/thread.jspa?messageID=164220).

Pierwsze podsumowaniach przedmiot (głowę) nie uzyskać rzeczywiste dane tak powinno być stosunkowo niedroga eksploatacja i jeśli tylko odrzucając listy to można zrobić:

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

Który daje liczba obiektów bez tworzenia listy.

0

Pożyczanie od similar question, jedną z opcji pobrania pełnej listy kluczy obiektów z przedrostka bucket + jest użycie rekursji z użyciem metody list_objects_v2.

Ta metoda rekursywnie pobierze listę kluczy obiektów po 1000 kluczy jednocześnie.

Każde żądanie do list_objects_v2 używa argumentu StartAfter, aby kontynuować wyświetlanie kluczy po ostatnim kluczu z poprzedniego żądania.

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)) 
Powiązane problemy