如何使用Boto3获取AWS S3存储桶pictures子文件夹的所有文件?
解决Boto3仅下载S3指定子文件夹文件的问题
首先要明确:AWS S3中没有真正的“文件夹”概念,所谓的子文件夹其实是通过对象key的前缀来模拟的。你不能把路径拼到Bucket名称里(比如MainBucket/pictures),Bucket名称始终是MainBucket,需要通过过滤对象key的前缀来获取目标子文件夹下的内容。
正确实现方式
修改代码,通过filter(Prefix='pictures/')筛选出pictures子文件夹下的所有对象,同时建议保留本地文件夹结构,避免文件重名覆盖:
import os import boto3 # 初始化S3资源 s3 = boto3.resource( 's3', aws_access_key_id='__________', aws_secret_access_key='________', region_name='______' ) # 指定目标Bucket my_bucket = s3.Bucket('MainBucket') # 定义要下载的子文件夹前缀 target_prefix = 'pictures/' # 遍历并下载指定前缀下的对象 for s3_object in my_bucket.objects.filter(Prefix=target_prefix): # 分割key,获取相对路径和文件名 # 去掉前缀,得到本地要保存的相对路径 relative_path = os.path.relpath(s3_object.key, target_prefix) # 跳过S3中用于模拟文件夹的空对象(key以/结尾) if not relative_path: continue # 确保本地目录存在 local_dir = os.path.dirname(relative_path) if local_dir and not os.path.exists(local_dir): os.makedirs(local_dir) # 下载文件到对应本地路径 my_bucket.download_file(s3_object.key, relative_path)
关键说明
objects.filter(Prefix='pictures/'):该方法会返回所有key以pictures/开头的对象,精准定位目标子文件夹内容。注意前缀末尾的/不能省略,否则会匹配到所有以pictures开头的key(比如pictures123.jpg这类不属于该子文件夹的文件)。- 保留本地目录结构:原代码仅提取文件名,会导致所有文件下载到当前目录,容易出现重名覆盖。上述代码通过
os.path.relpath去掉前缀,保留子文件夹层级结构,并自动创建对应的本地目录。
内容的提问来源于stack exchange,提问作者Simon GIS
相关产品推荐
相关产品推荐

