如何将本地目录中特定扩展名的文件批量上传至AWS S3存储桶
上传指定扩展名文件到AWS S3的方案
首先明确:s3_client.upload_file() 仅支持上传单个文件,不识别通配符(比如*.log),所以你直接用这个写法会报错。下面提供几种可行的解决方案:
方案1:使用AWS CLI(推荐,无需写代码)
AWS CLI的s3 sync命令原生支持文件过滤,能快速完成批量上传,无需编写代码。命令格式如下:
aws s3 sync ./本地目录路径 s3://你的存储桶名称/目标文件夹 --exclude "*" --include "*.log"
--exclude "*":先排除所有文件--include "*.log":再包含所有.log后缀的文件- 如果需要递归上传子目录里的.log文件,直接加
--recursive参数即可
方案2:使用boto3遍历上传(代码实现)
如果必须用boto3实现,可以结合Python的glob模块匹配目标文件,然后逐个上传:
import boto3 import glob import os # 初始化S3客户端 s3_client = boto3.client('s3') # 本地目录路径 local_dir = './你的本地文件夹路径' # S3存储桶名称 S3_BUCKET = '你的存储桶名称' # S3目标文件夹(注意末尾可以加/,也可以不加) s3_folder = '目标文件夹路径/' # 匹配当前目录下所有.log文件(递归子目录用glob.glob(f"{local_dir}/**/*.log", recursive=True)) for log_file in glob.glob(f"{local_dir}/*.log"): # 获取文件名,用于构造S3对象键 file_name = os.path.basename(log_file) # 构造S3对象的完整键 s3_key = f"{s3_folder}{file_name}" # 执行上传 s3_client.upload_file(log_file, S3_BUCKET, s3_key) print(f"已完成上传: {log_file} -> s3://{S3_BUCKET}/{s3_key}")
如果需要保留本地的目录结构(比如子目录里的.log文件上传到S3对应子目录),可以调整s3_key的构造逻辑:
# 替换本地目录前缀,得到文件相对路径 relative_path = os.path.relpath(log_file, local_dir) s3_key = f"{s3_folder}{relative_path}"
补充说明
- boto3没有内置接口直接支持通配符批量上传,核心原因是
upload_file和upload_fileobj都是针对单个文件的上传接口 - 如果上传的文件数量极大,建议使用
s3transfer模块(boto3底层依赖的传输工具),它支持并发上传,效率更高,但本质还是基于匹配后的文件列表遍历上传
内容的提问来源于stack exchange,提问作者Shahar Hamuzim Rajuan
相关产品推荐
相关产品推荐

