使用下面的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做类似的事情?
答案 0 :(得分:0)
您可以使用Bundle Display Name
参数进行操作。
对于您的情况:
MaxKeys=1000
通常:
pfx_iterator = pfx_paginator.paginate(Bucket='app_folders', Delimiter='/', MaxKeys=1000)
这将对您便宜1000倍:) Documentation here
答案 1 :(得分:0)
使用 aws cli 很容易计算:
aws s3 ls <folder url> --recursive --summarize | grep <comment>
例如
aws s3 ls s3://abc/ --recursive --summarize | grep "Number of Objects"