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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:40:24