如何使用boto3替代s3fs实现文件gzip压缩后上传至AWS S3
基于boto3的本地文件gzip压缩后上传S3实现
以下代码无需额外安装第三方依赖,兼容AWS Lambda默认运行环境:
import contextlib import gzip import io import boto3 # 初始化S3资源,Lambda默认会自动读取执行角色的权限,无需手动配置密钥 s3_resource = boto3.resource('s3') # 替换为实际的S3桶名称 bucket = s3_resource.Bucket('testunzipping') # testList为/tmp目录下待处理的本地文件路径列表,示例:["/tmp/your_file.txt", "/tmp/data.csv"] testList = [] for file_path in testList: with contextlib.ExitStack() as stack: # 打开本地源文件 source_file = stack.enter_context(open(file_path, mode="rb")) # 初始化内存字节流存储压缩数据 compressed_io = io.BytesIO() # 初始化gzip压缩对象 gzip_writer = stack.enter_context(gzip.GzipFile(fileobj=compressed_io, mode='wb')) # 分块读取并压缩,避免大文件占满Lambda内存,1MB分块可根据实际内存配置调整 while True: chunk = source_file.read(1024 * 1024) if not chunk: break gzip_writer.write(chunk) # 压缩完成后将字节流指针移到起始位置,准备上传 compressed_io.seek(0) # 生成S3端的文件名,可根据实际需求调整路径替换逻辑,自动添加.gz后缀 s3_object_key = file_path.replace("/tmp/DataPump_10000838/", "") + ".gz" # 上传到S3 bucket.upload_fileobj(compressed_io, s3_object_key)
注意事项
- Lambda执行角色需要配置目标S3桶的
s3:PutObject权限,否则会触发权限拒绝错误 - 分块大小可根据Lambda分配的内存调整,内存足够的情况下调大分块可以提升处理速度
- 若需要自定义S3存储类别、加密等属性,可在
upload_fileobj方法中添加ExtraArgs参数配置
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

