如何用Python Boto3按大小排序S3存储桶对象?
没问题!咱们来解决这个按大小排序S3存储桶对象的问题~
按大小排序S3存储桶对象的解决方案
首先,你的代码出问题的核心原因是:source_bucket.objects.all()返回的是S3 ObjectSummary对象的集合,而不是字典,所以用itemgetter('size')按键取值肯定会报错——这些对象的属性是通过点符号访问的,不是字典键。
下面给你两种可行的解决方法:
方案1:用lambda函数直接访问size属性
这是最直观的写法,直接在排序的key参数里指定取对象的size属性:
import boto3 # 初始化S3资源 s3 = boto3.resource('s3') source_bucket = s3.Bucket('你的存储桶名称') # 按文件大小升序排序(最小的文件排在最前面) sorted_objects = sorted(source_bucket.objects.all(), key=lambda obj: obj.size) # 如果需要降序排序(最大的文件在前),加上reverse=True即可 # sorted_objects = sorted(source_bucket.objects.all(), key=lambda obj: obj.size, reverse=True) # 遍历验证结果 for obj in sorted_objects: print(f"文件名: {obj.key}, 大小: {obj.size} 字节")
方案2:使用operator.attrgetter(更贴合你原本的思路)
如果你习惯用operator模块的工具,可以用attrgetter来获取对象属性,替代字典取值的itemgetter:
import boto3 from operator import attrgetter s3 = boto3.resource('s3') source_bucket = s3.Bucket('你的存储桶名称') # 按size属性完成排序 sorted_objects = sorted(source_bucket.objects.all(), key=attrgetter('size'))
额外提示
- 你的场景是1000个文件,
objects.all()会自动处理S3的分页逻辑,不用你额外编写分页代码。 - 如果后续对象数量特别多(比如几十万级),排序会在本地内存完成,可能需要考虑按前缀分批处理后再排序,避免内存占用过高。
内容的提问来源于stack exchange,提问作者codeexplorer
相关产品推荐
相关产品推荐

