簡體   English   中英

如何獲得boto3 Collection的大小?

[英]How do I get the size of a boto3 Collection?

我一直在使用的方法是將Collection轉換為List並查詢長度:

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

然而,這迫使整個系列的解決方案並且首先避免了使用Collection的好處。 有一個更好的方法嗎?

如果沒有列出所有對象,則無法獲取存儲桶中的密鑰數量這是AWS S3的限制(請參閱https://forums.aws.amazon.com/thread.jspa?messageID=164220 )。

獲取對象摘要(HEAD)不會獲得實際數據,因此應該是相對便宜的操作,如果您只是丟棄列表,那么您可以執行以下操作:

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

這將為您提供沒有構建列表的對象數量。

借用類似的問題 ,從bucket +前綴檢索對象鍵的完整列表的一個選項是使用list_objects_v2方法的遞歸。

此方法將以遞歸方式一次檢索對象鍵列表,1000個鍵。

list_objects_v2每個請求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))

對於我的用例,我只需要知道該文件夾是否為空。

s3 = boto3.client('s3')
response = s3.list_objects(
        Bucket='your-bucket',
        Prefix='path/to/your/folder/',
)
print(len(response['Contents']))

這足以知道文件夾是否為空。 請注意,如果在S3控制台中手動創建文件夾,則可以將其視為資源本身。 在這種情況下,如果上面顯示的長度大於1,則S3“文件夾”為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM