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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:51:56