2015-09-05 143 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),則無法獲取存儲桶中密鑰的計數。

獲取對象摘要(HEAD)沒有得到實際的數據,所以應該是一種相對廉價的操作,如果你是剛剛丟棄的名單,那麼你可以這樣做:

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

,這將給你的沒有構建列表的對象的數量。

0

借用similar question,從桶+前綴檢索對象鍵的完整列表的一個選項是使用遞歸與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))