繁体   English   中英

如何在boto3中获取过滤对象集合的大小

[英]How to get size of filtered objectsCollection in boto3

我尝试了以下方法来获取s3.Bucket.objectsCollection中 s3.Bucket.objectsCollection 的 len/content_length:

import boto3    
s3 = boto3.resource('s3')
bucket = s3.Bucket('myBucket')
bucketObjects = bucket.objects.filter(Prefix='myPrefix')
if (len(bucketObjects) > 0):
     do_something()
else:
     do_something_else()

不幸的是,这给了我以下错误:

TypeError: object of type 's3.Bucket.objectsCollection' has no len()

我也用bucketobjects.content_length试过这个并得到

AttributeError: 's3.Bucket.objectsCollection' object has no attribute 'content_length'

我是否必须遍历列表并计算对象,还是有更好的方法?

正如 Leo K 所说, bucket.objects.filter返回没有确定长度的可迭代对象。 但是您可以使用 limit 方法来限制迭代。 因此,如果您想检查列表中找到的一项,您可以使用以下内容:

results = bucket.objects.filter(Prefix=prefix_filter) if list(results.limit(1)): do_something() else: do_something_else()

bucket.objects.filter()(以及大多数其他返回对象集合的高级 boto3 调用)返回没有确定长度的可迭代对象。 这是故意的,因为列表的潜在大小可能非常大。 为了防止您的应用程序内存不足,它们永远不会一次全部加载 - 因此在您实际依次请求每个项目并到达最后之前,大小仍然未知。

如果您确定列表很短,请使用bucketObjects = list(bucketObjects)获取所有内容,但最好不要这样做。 通过一次读取一个来计算它们:

c=0
for b in bucketObjects: c+=1

(如果您确实需要最大效率,请尝试使用低级 api: client=boto3.client('s3')并在几次调用中获取大量列表,或者如果您确定它不会太大,则获取一次列出整个列表;但这很少值得)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM