我尝试将位于S3存储桶中的目录中保持相同目录结构的所有文件压缩,并将该zip文件放置在S3存储桶上。
使用BytesIO和zipfile从S3存储桶解压缩zip文件很容易,但我不确定如何处理包含数百个文件的目录。
我发现这篇链接对我有帮助,但是它是针对Lambda Node的文章。 创建一个在S3上基于文件创建zip文件
我尝试将位于S3存储桶中的目录中保持相同目录结构的所有文件压缩,并将该zip文件放置在S3存储桶上。
使用BytesIO和zipfile从S3存储桶解压缩zip文件很容易,但我不确定如何处理包含数百个文件的目录。
我发现这篇链接对我有帮助,但是它是针对Lambda Node的文章。 创建一个在S3上基于文件创建zip文件
import boto3
import io
import zipfile
import os
s3 = boto3.client('s3')
def zip_files(bucket_name, prefix):
# List all objects in the bucket with the specified prefix
response = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix)
# Create a BytesIO object to store the compressed data
zip_buffer = io.BytesIO()
for obj in response.get('Contents', []):
s3_object = s3.get_object(Bucket=bucket_name, Key=obj['Key'])
# Use the ZipFile module to write the contents of the S3 object to the zip stream
with zipfile.ZipFile(zip_buffer, 'w') as zip_file:
# Write the contents of the S3 object to the zip file
zip_file.writestr(obj['Key'], s3_object['Body'].read())
# Save the zip file to disk
with open(f'{prefix.rstrip("/")}.zip', 'wb') as f:
f.write(zip_buffer.getvalue())
# Upload the compressed data to the S3 bucket and delete
zip_buffer.seek(0)
s3.put_object(Bucket=bucket_name, Key=f'{prefix}{prefix.rstrip("/")}.zip', Body=zip_buffer)
os.remove(f'{prefix.rstrip("/")}.zip')
bucket = 'foobucket'
folders = ['foo/', 'bar/', 'baz/']
for folder in folders:
zip_files(bucket, folder)
os.remove
应该使进程保持轻量级。
另外:如果您在Lambda函数内运行此逻辑,则必须调整它以适应Lambda所需的格式。
显然,根据您的需求添加日志记录和错误处理。
希望这可以帮助您!