Я использую Boto3 в AWS Lambda для обработки потока данных и публикации содержимого в файл в s3 для последующей обработки.В этом случае данные могут быть просто необработанными.
Я хотел бы использовать zlib
для хранения сжатых данных gzip на S3.В теории это просто.Однако, когда я загружаю файл 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