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

aws s3 ls命令对应的boto3等效高效实现方案是什么?

高效实现方案

AWS CLI执行aws s3 ls速度快的核心原因是调用list_objects_v2接口时默认添加了Delimiter='/'参数,S3服务端会直接按路径分隔符分组返回结果,无需拉取prefix下所有层级的全量对象。你现有代码慢就是因为没有加这个参数,会返回prefix下所有嵌套的对象,遍历拼接的开销自然很大。

优化后代码示例

import boto3

s3 = boto3.client('s3')

bucket = "my-bucket"
prefix = "my-prefix"
# prefix如果不以/结尾建议补全,避免匹配到前缀相同的其他目录
if not prefix.endswith('/'):
    prefix += '/'

paginator = s3.get_paginator('list_objects_v2')
# 新增Delimiter参数,指定按/分隔路径层级
page_iterator = paginator.paginate(
    Bucket=bucket,
    Prefix=prefix,
    Delimiter='/'
)

for page in page_iterator:
    # 输出当前层级的子目录,和原生ls的PRE格式对齐
    for common_prefix in page.get('CommonPrefixes', []):
        dir_name = common_prefix["Prefix"].split("/")[-2]
        print(f'PRE {dir_name}/')
    # 输出当前层级的文件
    for content in page.get('Contents', []):
        file_name = content['Key'].split('/')[-1]
        print(f'{content["LastModified"]} {content["Size"]} {file_name}')

原理说明

  • 传入Delimiter='/'后,S3会将prefix下所有路径中包含/的嵌套对象归集到CommonPrefixes字段返回,仅返回当前层级的目录和直接存放在当前层级的文件,不会拉取所有下层对象
  • 当路径下对象数量极多时,该方式的请求返回数据量仅和当前层级的目录、文件数量相关,和下层嵌套的对象数量无关,性能和AWS CLI完全一致

内容的提问来源于stack exchange,提问作者Alan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:15:11