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

如何用Boto3获取S3指定前缀下的一级子目录(不含文件)

获取S3指定前缀下的一级子目录最优方案

核心思路:用S3原生的Delimiter参数实现层级过滤

S3虽是扁平的对象存储,但可以通过Delimiter参数模拟目录层级,直接获取指定前缀下的一级子目录,不用扫描所有对象,彻底避免后过滤带来的额外成本。

代码实现

用boto3客户端调用list_objects_v2接口,配合Delimiter参数:

import boto3

# 初始化S3客户端
s3_client = boto3.client('s3')
bucket_name = 'my-bucket'
target_prefix = 'databases/mysql-'

# 调用S3接口获取一级子目录
response = s3_client.list_objects_v2(
    Bucket=bucket_name,
    Prefix=target_prefix,
    Delimiter='/'
)

# 解析并输出目标目录名
if 'CommonPrefixes' in response:
    for item in response['CommonPrefixes']:
        # 去掉前缀和末尾的斜杠,得到纯目录名
        dir_name = item['Prefix'].replace(target_prefix, '').rstrip('/')
        print(dir_name)

关键说明

  • Delimiter='/':让S3按斜杠分割路径,只返回当前前缀下的一级子前缀(也就是你要的mysql-<date>-<hour>)
  • CommonPrefixes:接口返回的这个字段里,就是所有符合条件的一级子目录对应的前缀,处理后就能得到你要的目录名
  • 这种方式只请求S3返回需要的层级数据,不会遍历子目录下的所有文件,是成本和效率最优的方案

原方案的问题

你之前用my_bucket.objects.filter(Prefix=prefix)会拉取所有以该前缀开头的对象,包括子目录里的tarfiles.tar.gz这类文件,后续再过滤等于做了无用功,既增加S3请求量又浪费处理时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:15:53