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

AWS Lambda压缩S3文件时去除路径仅保留文件对象

解决AWS Lambda压缩S3文件时保留完整路径的问题

你的代码核心问题是将S3对象的完整key(包含路径)直接作为压缩包内的文件名,导致压缩包带了路径结构。只需修改文件名的获取逻辑,只保留文件本身的名称即可。

修改后的完整代码:

import zipfile
import boto3
from io import BytesIO
import os  # 新增导入,用于提取文件名

def lambda_handler(event, context):
    in_bucket = 'in_bucket'
    in_key = 'test/run_id=123/'
    out_bucket = 'out_bucket'
    out_key = 'test/zip_output/model.zip'
    
    create_zip(in_bucket, in_key, out_bucket, out_key)  # 修正原代码函数名调用错误

def create_zip(in_bucket, in_key, out_bucket, out_key):
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(in_bucket)
    files_collection = bucket.objects.filter(Prefix=in_key).all()
    
    archive = BytesIO()
    with zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED) as zip_archive:
        for f in files_collection:
            # 跳过S3的空文件夹对象(前缀结尾为/的无内容条目)
            if f.key.endswith('/'):
                continue
            # 提取纯文件名,剥离完整路径
            filename = os.path.basename(f.key)
            with zip_archive.open(filename, 'w') as file1:
                file1.write(f.get()['Body'].read())  

    archive.seek(0)
    s3.Object(out_bucket, out_key).upload_fileobj(archive)
    archive.close()

关键改动说明:

  • 新增import os,通过os.path.basename(f.key)提取文件名,例如test/run_id=123/file.csv会被处理为file.csv
  • 修正原代码中lambda_handler里的函数名调用错误(原调用createZipFileStream应为create_zip)
  • 添加空文件夹判断逻辑,避免压缩包中出现无意义的空文件夹条目

注意:如果不同路径下存在同名文件,压缩时会被后续文件覆盖。若需避免这种情况,可以给文件名添加前缀(比如保留部分路径层级)或后缀区分。

内容的提问来源于stack exchange,提问作者slysid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:12:29