我一直使用的方式是集合轉換成一個列表,查詢長度:如何獲得boto3集合的大小?
s3 = boto3.resource('s3')
bucket = s3.Bucket('my_bucket')
size = len(list(bucket.objects.all()))
然而,整個集合的這股勢力的分辨率和消除在第一時間使用收集的好處。有一個更好的方法嗎?
我一直使用的方式是集合轉換成一個列表,查詢長度:如何獲得boto3集合的大小?
s3 = boto3.resource('s3')
bucket = s3.Bucket('my_bucket')
size = len(list(bucket.objects.all()))
然而,整個集合的這股勢力的分辨率和消除在第一時間使用收集的好處。有一個更好的方法嗎?
如果沒有列出所有對象(這是AWS S3的限制)(請參閱https://forums.aws.amazon.com/thread.jspa?messageID=164220),則無法獲取存儲桶中密鑰的計數。
獲取對象摘要(HEAD)沒有得到實際的數據,所以應該是一種相對廉價的操作,如果你是剛剛丟棄的名單,那麼你可以這樣做:
size = sum(1 for _ in bucket.objects.all())
,這將給你的沒有構建列表的對象的數量。
借用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))