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

2024-10-01 11:24:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试了以下方法来获得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'

我是要遍历列表并计算对象数还是有更好的方法?在


Tags: 方法importlens3bucketcontentboto3do
2条回答

在bucket.objects.filter()(以及大多数其他返回对象集合的高级boto3调用)返回没有固定长度的iterable对象。这是经过深思熟虑的,因为列表的潜在规模可能非常大。为了防止你的应用程序耗尽内存,它们永远不会一次全部加载,所以大小一直是未知的,直到你真正要求每一个项目并到达最后。在

如果您确定列表很短,请使用bucketObjects = list(bucketObjects)获取所有列表,但最好不要这样做。一次读一个数:

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

(如果您真的需要最大的效率,请尝试使用低级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()

相关问题 更多 >