如何修改Boto3代码从AWS S3指定文件夹/子文件夹下载特定文件
AWS S3 仅下载指定文件夹/子文件夹的文件解决方案
嘿,我懂你现在遇到的问题——原本的代码能搞定单个文件下载,但碰到桶里有多个文件夹时,就会一股脑把整个桶的内容都拉下来,这肯定不是你想要的结果。其实S3里所谓的“文件夹”本质上是对象键的前缀,我们只要针对性过滤这个前缀,就能精准下载指定目录的内容,下面给你具体的修改方案:
核心思路
S3没有真实的文件夹结构,所有文件都是以桶名/键的形式存储的。我们可以通过Prefix参数过滤出所有以目标文件夹路径开头的对象,再跳过虚拟的文件夹空对象,还能额外筛选特定类型的文件。
修改后的完整代码
from boto3.session import Session # 你的AWS密钥信息 ACCESS_KEY = 'ABC' SECRET_KEY = 'XYZ' # 替换成你要下载的目标文件夹前缀,注意末尾必须加斜杠! TARGET_FOLDER_PREFIX = 'your/target/folder/' # 可选:如果只下载特定类型文件,比如CSV,就填对应的后缀,不需要的话设为None TARGET_FILE_EXT = '.csv' # 替换成你的S3桶名称 BUCKET_NAME = 'your-bucket-name' # 初始化S3会话和资源 session = Session(aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY) s3 = session.resource('s3') bucket = s3.Bucket(BUCKET_NAME) # 遍历并下载指定前缀下的文件 for obj in bucket.objects.filter(Prefix=TARGET_FOLDER_PREFIX): # 跳过S3虚拟的文件夹对象(这类对象的键末尾是斜杠,没有实际内容) if obj.key.endswith('/'): continue # 如果设置了文件后缀过滤,跳过不符合的文件 if TARGET_FILE_EXT and not obj.key.endswith(TARGET_FILE_EXT): continue # 处理本地保存路径:去掉前缀,保留子文件夹结构 local_file_path = obj.key.replace(TARGET_FOLDER_PREFIX, '') # 执行下载 bucket.download_file(obj.key, local_file_path) print(f"成功下载: {obj.key} -> 本地路径 {local_file_path}")
关键细节说明
- 前缀的斜杠很重要:比如
your/target/folder/末尾的斜杠能避免匹配到类似your/target/folderXYZ这类不相关的键 - 跳过虚拟文件夹:S3为了显示文件夹结构会创建空对象,键末尾带斜杠,这些不需要下载
- 灵活的文件过滤:如果不需要筛选文件类型,把
TARGET_FILE_EXT设为None即可,代码会自动跳过这个判断 - 保留子文件夹结构:通过替换前缀的方式,本地会自动生成和S3一致的子文件夹结构,不会把所有文件堆在一个目录里
这样修改后,代码就只会下载你指定的文件夹(包括子文件夹)里的内容,不会再遍历整个存储桶啦!
内容的提问来源于stack exchange,提问作者Taukheer
相关产品推荐
相关产品推荐

