将 Pako deflate 与 Python 结合使用

Luc*_*ild 2 javascript python compression pako

我正在尝试压缩字典以访问 API。
我阅读了某人用 JavaScript 和一个名为“pako”的库压缩数据的代码,并自己尝试了。它工作完美:

var myDictionary = {...}

var b = pako.deflate(JSON.stringify(a), { 
    to: "string", 
    gzip: !0 
  }); 
  return b = btoa(b) 
}

var compressed = b(n)
Run Code Online (Sandbox Code Playgroud)

现在我想用Python做同样的事情:我尝试了以下方法,但结果不同并且不起作用:

my_dictionary = {...}
data_json = json.dumps(my_dictionary, ensure_ascii=False)
data_gzip = zlib.compress(bytes(data_json, "utf-8"))
compressed = base64.b64encode(bytes(str(data_gzip), "utf-8"))
Run Code Online (Sandbox Code Playgroud)

有谁知道如何用Python解决这个问题吗?Python 是否有类似 pako 的库?

ydr*_*all 9

如果有人仍在 python 3 中寻找 pako 等效方法(未在 python 2 中测试)。

python 中的 pako.deflate() 方法等效:

def pako_deflate(data):
    compress  = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, 15, 
        memLevel=8, strategy=zlib.Z_DEFAULT_STRATEGY)
    compressed_data = compress.compress(js_string_to_byte(js_encode_uri_component(data)))
    compressed_data += compress.flush()
    return compressed_data
Run Code Online (Sandbox Code Playgroud)

pako.deflateRaw() 在 python 中等效:

def pako_deflate_raw(data):
    compress = zlib.compressobj(
        zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, -15, memLevel=8,
        strategy=zlib.Z_DEFAULT_STRATEGY)
    compressed_data = compress.compress(js_string_to_byte(js_encode_uri_component(data)))
    compressed_data += compress.flush()
    return compressed_data
Run Code Online (Sandbox Code Playgroud)

pako.inflate() 方法等效:

def pako_inflate(data):
    decompress = zlib.decompressobj(15)
    decompressed_data = decompress.decompress(data)
    decompressed_data += decompress.flush()
    return decompressed_data
Run Code Online (Sandbox Code Playgroud)

pako.inflateRaw() 等效方法:

def pako_inflate_raw(data):
    decompress = zlib.decompressobj(-15)
    decompressed_data = decompress.decompress(data)
    decompressed_data += decompress.flush()
    return decompressed_data
Run Code Online (Sandbox Code Playgroud)

上述函数中使用的一些实用函数是:

from urllib.parse import quote, unquote
import base64

def js_encode_uri_component(data):
    return quote(data, safe='~()*!.\'')


def js_decode_uri_component(data):
    return unquote(data)


def js_string_to_byte(data):
    return bytes(data, 'iso-8859-1')


def js_bytes_to_string(data):
    return data.decode('iso-8859-1')


def js_btoa(data):
    return base64.b64encode(data)


def js_atob(data):
    return base64.b64decode(data)
Run Code Online (Sandbox Code Playgroud)