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
相关产品推荐
相关产品推荐

