【问题标题】:Writing Gzip Files in AWS Lambda Boto3在 AWS Lambda Boto3 中编写 Gzip 文件
【发布时间】:2018-10-08 23:23:01
【问题描述】:

我在 AWS Lambda 上使用 Boto3 处理数据流并将内容发布到 s3 中的文件以进行下游处理。在这种情况下,数据可以是简单的原始 json。

我想使用zlib 将压缩的 gzip 数据存储到 S3。理论上这很简单。但是,当我使用以下内容上传 gzip 文件时,我的本地机器说该文件不是 gzip 格式。

有人可以帮助解释这里发生了什么吗?这应该是微不足道的。值得一提的是,当我阅读其他程序生成的 gzip 压缩文件时,zlib.decompress 需要 , 16+zlib.MAX_WBITS 作为 wbits 参数才能正确读取压缩字符串。也许我需要zlib.compress 等价物?

import json
import zlib
import boto3
s3 = boto3.resource('s3')

def lambda_handler(event, context):
    ## Sample dataset
   data = [{"var":1, "foo": "bar"}, {"var":2, "foo":"baz"}]
   payload = '\n'.join([json.dumps(r) for r in data]).encode('utf-8')

    ## Upload
    output = s3.Object("bucket", "file")
    output.put(Body=zlib.compress(payload))

    ## Download and verify
    obj = s3.Object("bucket", "file")

    ## Load the Streaming object body, decompress, decode
    # , 16+zlib.MAX_WBITS
    decompressed = zlib.decompress(obj.get()['Body'].read(), 16+zlib.MAX_WBITS).decode('utf-8').split("\n")
    print(f"Decompressed payload: {payload}")
    data2 = [json.loads(r) for r in decompressed]

    return {
        "statusCode": 200,
        "TestVerification?": data2==data,
        "body": json.dumps('Demo')
    }

稍后,将文件下载到本地:

zcat testcompressed.gz

gzip: testcompressed.gz: not in gzip format

【问题讨论】:

    标签: python amazon-s3 gzip zlib


    【解决方案1】:

    是的,您需要 zlib.compress 等效项。然而,一个都没有。您需要使用zlib.compressobj,它有一个wbits 参数。

    【讨论】:

    • 正确,这有效:compressor = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16) compressed = compressor.compress("This is a test1234".encode('utf-8')) + compressor.flush()
    猜你喜欢
    • 2021-09-27
    • 2016-01-12
    • 2019-05-09
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    相关资源
    最近更新 更多