zac*_*618 2 python gzip zlib amazon-s3
我在 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')
}
Run Code Online (Sandbox Code Playgroud)
之后,将文件下载到本地:
zcat testcompressed.gz
gzip: testcompressed.gz: not in gzip format
Run Code Online (Sandbox Code Playgroud)
是的,你需要zlib.compress
同等的东西。然而,没有一个。相反,您需要使用zlib.compressobj
,它有一个wbits
参数。
归档时间: |
|
查看次数: |
2854 次 |
最近记录: |