Python 在AWS Lambda Boto3中编写Gzip文件

Python 在AWS Lambda Boto3中编写Gzip文件,python,amazon-s3,gzip,zlib,Python,Amazon S3,Gzip,Zlib,我在AWS Lambda上使用Boto3来处理数据流,并将内容发布到s3中的一个文件中进行下游处理。在这种情况下,数据可以是简单的原始json 我想使用zlib将压缩的gzip数据存储到S3。理论上这很简单。但是,当我使用以下命令上载gzip文件时,我的本地机器会说该文件不是gzip格式 有人能解释一下这里发生了什么吗?这应该是微不足道的。值得一提的是,当我读取其他程序生成的gzip文件时,zlib.decompression需要,16+zlib.MAX_WBITS作为WBITS参数,以便正确读

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

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

有人能解释一下这里发生了什么吗?这应该是微不足道的。值得一提的是,当我读取其他程序生成的gzip文件时,
zlib.decompression
需要
,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

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

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

Spot-on,这起作用了:
compressor=zlib.compressobj(9,zlib.DEFLATED,zlib.MAX_wbits | 16)compressed=compressor.compressor(“这是一个test1234.encode('utf-8'))+compressor.flush()
Spot-on,这起作用了:
compressor=zlib.compressobj(9,zlib.DEFLATED,zlib.MAX|WBITS | 16)compressed=compressor.compression(“这是一个test1234.encode('utf-8'))+compressor.flush()