You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:00:11