将 s3 位置上的 .txt 文件压缩为 .gz 文件
compress .txt file on s3 location to .gz file
我需要将一个 .txt- 文件压缩到 S3 位置上的 .gz 文件,然后将其上传到不同的 S3 存储桶。我已经编写了以下代码,但它没有按预期工作:
def upload_gzipped(bucket, key, fp, compressed_fp=None, content_type='text/plain'):
with gzip.GzipFile(fileobj=compressed_fp, mode='wb') as gz:
shutil.copyfileobj(fp, gz)
compressed_fp.seek(0)
print(compressed_fp)
bucket.upload_fileobj(
compressed_fp,
key,
{'ContentType': content_type, 'ContentEncoding': 'gzip'})
source_bucket = event['Records'][0]['s3']['bucket']['name']
file_key_name = event['Records'][0]['s3']['object']['key']
response = s3.get_object(Bucket=source_bucket, Key=file_key_name)
original = BytesIO(response['Body'].read())
original.seek(0)
upload_gzipped(source_bucket, file_key_name, original)
有人可以在这里帮忙,或者用任何其他方法将文件 gzip 到 S3 位置
看起来您正在编写 AWS Lambda 函数。
一个更简单的程序流程可能是:
- 使用
s3_client.download_file()
将文件下载到/tmp/
- Gzip 文件
- 使用
s3.client_upload_file()
将文件上传到S3
- 删除
/tmp/
中的文件
另外,请注意 AWS Lambda 函数可能会通过 event
传递的多个对象被调用。但是,您的代码当前仅处理带有 event['Records'][0]
的第一条记录。程序应该像这样循环遍历这些记录:
for record in event['Records']:
source_bucket = record['s3']['bucket']['name']
file_key_name = record['s3']['object']['key']
...
与其将文件写入您的 /tmp 文件夹,不如将其读入缓冲区,因为 /tmp 文件夹的内存有限。
buffer = BytesIO(file.get()["Body"].read())
对于 gzip 压缩,您可以简单地使用这样的东西:
gzipped_content = gzip.compress(f_in.read())
destinationbucket.upload_fileobj(io.BytesIO(gzipped_content),
final_file_path,
ExtraArgs={"ContentType": "text/plain"}
)
这里有一个关于 Lambda 函数的类似教程:https://medium.com/p/f7bccf0099c9
我需要将一个 .txt- 文件压缩到 S3 位置上的 .gz 文件,然后将其上传到不同的 S3 存储桶。我已经编写了以下代码,但它没有按预期工作:
def upload_gzipped(bucket, key, fp, compressed_fp=None, content_type='text/plain'):
with gzip.GzipFile(fileobj=compressed_fp, mode='wb') as gz:
shutil.copyfileobj(fp, gz)
compressed_fp.seek(0)
print(compressed_fp)
bucket.upload_fileobj(
compressed_fp,
key,
{'ContentType': content_type, 'ContentEncoding': 'gzip'})
source_bucket = event['Records'][0]['s3']['bucket']['name']
file_key_name = event['Records'][0]['s3']['object']['key']
response = s3.get_object(Bucket=source_bucket, Key=file_key_name)
original = BytesIO(response['Body'].read())
original.seek(0)
upload_gzipped(source_bucket, file_key_name, original)
有人可以在这里帮忙,或者用任何其他方法将文件 gzip 到 S3 位置
看起来您正在编写 AWS Lambda 函数。
一个更简单的程序流程可能是:
- 使用
s3_client.download_file()
将文件下载到 - Gzip 文件
- 使用
s3.client_upload_file()
将文件上传到S3
- 删除
/tmp/
中的文件
/tmp/
另外,请注意 AWS Lambda 函数可能会通过 event
传递的多个对象被调用。但是,您的代码当前仅处理带有 event['Records'][0]
的第一条记录。程序应该像这样循环遍历这些记录:
for record in event['Records']:
source_bucket = record['s3']['bucket']['name']
file_key_name = record['s3']['object']['key']
...
与其将文件写入您的 /tmp 文件夹,不如将其读入缓冲区,因为 /tmp 文件夹的内存有限。
buffer = BytesIO(file.get()["Body"].read())
对于 gzip 压缩,您可以简单地使用这样的东西:
gzipped_content = gzip.compress(f_in.read())
destinationbucket.upload_fileobj(io.BytesIO(gzipped_content),
final_file_path,
ExtraArgs={"ContentType": "text/plain"}
)
这里有一个关于 Lambda 函数的类似教程:https://medium.com/p/f7bccf0099c9