我尝试了以下方法来获得boto3 v1.7.37中s3.Bucket.objectsCollection
的len/content_长度:
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()
不幸的是,这给了我以下错误:
^{pr2}$我也用bucketobjects.content_length
尝试过这个方法,得到了
AttributeError: 's3.Bucket.objectsCollection' object has no attribute 'content_length'
我是要遍历列表并计算对象数还是有更好的方法?在
在bucket.objects.filter()(以及大多数其他返回对象集合的高级boto3调用)返回没有固定长度的iterable对象。这是经过深思熟虑的,因为列表的潜在规模可能非常大。为了防止你的应用程序耗尽内存,它们永远不会一次全部加载,所以大小一直是未知的,直到你真正要求每一个项目并到达最后。在
如果您确定列表很短,请使用
bucketObjects = list(bucketObjects)
获取所有列表,但最好不要这样做。一次读一个数:(如果您真的需要最大的效率,请尝试使用低级api:
client=boto3.client('s3')
并在几个调用中获取列表的大块内容,或者如果您确定它不是太大,则立即获取整个列表;但这很少值得这样做)正如Leo K所说,
bucket.objects.filter
返回没有固定长度的iterable对象。但是可以使用limit方法来限制迭代。因此,如果您想查看列表中是否有找到的项目,您可以使用以下选项:results = bucket.objects.filter(Prefix=prefix_filter) if list(results.limit(1)): do_something() else: do_something_else()
相关问题 更多 >
编程相关推荐