如何用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
相关产品推荐
相关产品推荐

