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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:27:03