【问题标题】:Counting keys in an S3 bucket计算 S3 存储桶中的键
【发布时间】:2017-01-20 09:25:59
【问题描述】:

使用下面的 boto3 库和 python 代码,我可以遍历 S3 存储桶和前缀,打印出前缀名称和键名称,如下所示:

import boto3
client = boto3.client('s3')

pfx_paginator = client.get_paginator('list_objects_v2')
pfx_iterator = pfx_paginator.paginate(Bucket='app_folders', Delimiter='/')
for prefix in pfx_iterator.search('CommonPrefixes'):
    print(prefix['Prefix'])

    key_paginator = client.get_paginator('list_objects_v2')
    key_iterator = key_paginator.paginate(Bucket='app_folders', Prefix=prefix['Prefix'])
    for key in key_iterator.search('Contents'):
        print(key['Key'])

在密钥循环中,我可以放入一个计数器来计算密钥(文件)的数量,但这是一项昂贵的操作。有没有办法在给定存储桶名称和前缀的情况下进行一次调用并返回该前缀中包含的键的计数(即使它超过 1000 个)?

更新:我发现了一个帖子 here,它显示了一种使用 AWS CLI 执行此操作的方法,如下所示:

aws s3api list-objects --bucket BUCKETNAME --prefix "folder/subfolder/" --output json --query "[length(Contents[])]"

有没有办法用 boto3 API 做类似的事情?

【问题讨论】:

标签: python python-2.7 amazon-web-services amazon-s3 boto3


【解决方案1】:

您可以使用MaxKeys=1000 参数来实现。 对于您的情况:

pfx_iterator = pfx_paginator.paginate(Bucket='app_folders', Delimiter='/', MaxKeys=1000)

一般:

response = client.list_objects_v2(
    Bucket='string',
    Delimiter='string',
    EncodingType='url',
    MaxKeys=123,
    Prefix='string',
    ContinuationToken='string',
    FetchOwner=True|False,
    StartAfter='string',
    RequestPayer='requester'
)

对你来说会便宜1000倍:) Documentation here

【讨论】:

    【解决方案2】:

    使用 aws cli 很容易计算:

    aws s3 ls  <folder url> --recursive --summarize | grep <comment>
    

    例如,

    aws s3 ls  s3://abc/ --recursive --summarize | grep "Number of Objects"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-12
      • 2021-10-11
      • 2010-10-16
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多