使用boto3调用list_objects_v2无法获取S3存储桶全部文件夹名称求助
问题原因
你的代码只返回存在以/结尾的占位符对象的“文件夹”,但S3中的文件夹本质是虚拟概念——很多时候所谓的“文件夹”只是因为有文件存放在该前缀下(比如folder1/file.jpg),但并没有专门创建folder1/这个占位符对象,这类“文件夹”不会出现在Contents列表里,所以你的代码抓不到。
解决方案
使用S3 API的Delimiter参数来获取前缀,这是官方推荐的获取“文件夹”的方式,它会自动把相同前缀的对象分组,返回所有一级文件夹(不管有没有占位符)。修改后的代码如下:
def get_folders(source_bucket): folders = [] # 确保client是已初始化的boto3客户端 paginator = client.get_paginator('list_objects_v2') # 添加Delimiter='/'参数,按/分组前缀 pages = paginator.paginate(Bucket=source_bucket, Delimiter='/') for page in pages: # 提取所有一级文件夹前缀 if 'CommonPrefixes' in page: for prefix in page['CommonPrefixes']: folders.append(prefix['Prefix']) return folders
递归获取所有层级的文件夹
如果需要获取所有层级的子文件夹,可以用递归方式遍历每个前缀:
def get_all_folders(source_bucket, prefix=''): folders = [] paginator = client.get_paginator('list_objects_v2') pages = paginator.paginate(Bucket=source_bucket, Prefix=prefix, Delimiter='/') for page in pages: if 'CommonPrefixes' in page: for common_prefix in page['CommonPrefixes']: folder = common_prefix['Prefix'] folders.append(folder) # 递归遍历子文件夹 folders.extend(get_all_folders(source_bucket, prefix=folder)) return folders
内容的提问来源于stack exchange,提问作者user3435047
相关产品推荐
相关产品推荐

