Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Python中使用Pako deflate_Javascript_Python_Compression_Pako - Fatal编程技术网

Javascript 在Python中使用Pako deflate

Javascript 在Python中使用Pako deflate,javascript,python,compression,pako,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) 现在我想用Python做同样的事情:

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

var myDictionary = {...}

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

var compressed = b(n)
现在我想用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"))

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

以防仍有人在Python3中寻找与pako等效的方法(未在Python2中测试)

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
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
python中的pako.deflateRaw()等价物:

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
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
pako.充气()方法等效:

def pako_inflate(data):
    decompress = zlib.decompressobj(15)
    decompressed_data = decompress.decompress(data)
    decompressed_data += decompress.flush()
    return decompressed_data
def pako_inflate_raw(data):
    decompress = zlib.decompressobj(-15)
    decompressed_data = decompress.decompress(data)
    decompressed_data += decompress.flush()
    return decompressed_data
pako.inflateRaw()等效方法:

def pako_inflate(data):
    decompress = zlib.decompressobj(15)
    decompressed_data = decompress.decompress(data)
    decompressed_data += decompress.flush()
    return decompressed_data
def pako_inflate_raw(data):
    decompress = zlib.decompressobj(-15)
    decompressed_data = decompress.decompress(data)
    decompressed_data += decompress.flush()
    return decompressed_data
上述功能中使用的一些实用功能包括:

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)

“不起作用”是什么意思?你需要在你的问题上有明确的表述。结果是不同的,这是意料之中的,而且很可能是无关紧要的。重要的是结果会解压缩到原始数据。那么你所说的“而且不起作用”到底是什么意思呢?会发生什么?输出与JavaScript生成的输出不同。因此API不接受Python的输出。但是JavaScript的输出是有效的。