2015-09-05 12 views
9

Il modo in cui ho utilizzato è quello di trasformare la Collezione in un elenco e interrogare la lunghezza:Come si ottiene la dimensione di una raccolta boto3?

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

Tuttavia, questa risoluzione le forze di tutta la collezione e elimina i vantaggi di utilizzare una raccolta in primo luogo. C'è un modo migliore per farlo?

risposta

17

Non c'è modo di ottenere il conteggio delle chiavi in ​​un bucket senza elencare tutti gli oggetti questa è una limitazione di AWS S3 (vedere https://forums.aws.amazon.com/thread.jspa?messageID=164220).

Ottenere i Riassunti Object (testa) non ottiene i dati effettivi in ​​modo da dovrebbe essere un'operazione relativamente poco costoso e se sono solo scartando la lista, allora si potrebbe fare:

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

che vi darà il numero di oggetti senza costruire una lista.

0

Prendendo in prestito da un similar question, un'opzione per recuperare l'elenco completo di chiavi oggetto da un bucket + prefisso è utilizzare la ricorsione con il metodo list_objects_v2.

Questo metodo recupererà in modo ricorsivo l'elenco di chiavi oggetto, 1000 chiavi alla volta.

Ogni richiesta a list_objects_v2 utilizza l'argomento StartAfter per continuare a elencare le chiavi dopo l'ultima chiave della richiesta precedente.

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))