如何获得 boto3 集合的大小?
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()))
但是,这会强制解析整个集合并首先消除使用集合的好处。有更好的方法吗?
如果不列出所有对象,就无法获取存储桶中键的数量,这是 AWS S3 的限制(参见 https://forums.aws.amazon.com/thread.jspa?messageID=164220)。
获取对象摘要 (HEAD) 不会获取实际数据,因此应该是一个相对便宜的操作,如果您只是丢弃列表,那么您可以这样做:
size = sum(1 for _ in bucket.objects.all())
这将在不构建列表的情况下为您提供对象的数量。
借用 similar question, one option to retrieve the complete list of object keys from a bucket + prefix is to use recursion with the 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))
对于我的用例,我只需要知道文件夹是否为空。
s3 = boto3.client('s3')
response = s3.list_objects(
Bucket='your-bucket',
Prefix='path/to/your/folder/',
)
print(len(response['Contents']))
这足以知道文件夹是否为空。请注意,如果在 S3 控制台中手动创建文件夹,则文件夹本身可以算作资源。在这种情况下,如果上面显示的长度大于1,则S3“文件夹”不是空
我一直使用的方式是将Collection转化为List并查询长度:
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, one option to retrieve the complete list of object keys from a bucket + prefix is to use recursion with the 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))
对于我的用例,我只需要知道文件夹是否为空。
s3 = boto3.client('s3')
response = s3.list_objects(
Bucket='your-bucket',
Prefix='path/to/your/folder/',
)
print(len(response['Contents']))
这足以知道文件夹是否为空。请注意,如果在 S3 控制台中手动创建文件夹,则文件夹本身可以算作资源。在这种情况下,如果上面显示的长度大于1,则S3“文件夹”不是空