Написание файлов Gzip в AWS Lambda Boto3 - PullRequest
0 голосов
/ 09 октября 2018

Я использую 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

1 Ответ

0 голосов
/ 09 октября 2018

Да, вам понадобится эквивалент zlib.compress.Тем не менее, нет ни одного.Вместо этого вам нужно использовать zlib.compressobj, который имеет параметр wbits.

...