3

我对 python 编程语言非常陌生,我遇到了模块 zstandard 的问题。我目前正在使用 Halite 的重播文件。因为它们是用 zstandard 压缩的,所以我必须使用这个模块。如果我读了一个文件,一切都很好!我可以解压缩“.hlt”文件。

但是我已经对要保存在磁盘上以供以后使用的 json 数据进行了一些转换。我发现再次存储压缩数据非常有用,所以我使用了压缩器。压缩也很好。但是,如果我再次打开刚刚创建的文件,我会收到一条错误消息:“zstd.ZstdError: decompression error: Unknown frame descriptor”。

看看我下面的代码:

def getFileData(self, filename):
    with open(filename, "rb") as file:
        data = file.read()
    return data

def saveDataToFile(self, filename, data):
    with open(filename, "bw") as file:
        file.write(data)

def transformCompressedToJson(self, data, beautify=0):
    zd = ZstdDecompressor()
    decompressed = zd.decompress(data, len(data))
    return json.loads(decompressed)

def transformJsonToCompressed(self, jsonData, beautify=0):
    zc = ZstdCompressor()
    if beautify > 0:
        jsonData = json.dumps(jsonData, sort_keys=True, indent=beautify)
    objectCompressor = zc.compressobj()
    compressed = objectCompressor.compress(jsonData.encode())
    return objectCompressor.flush()

我在这里使用它:

rp = ReplayParser()

gameDict = rp.parse('replays/replay-20180215-152416+0100--4209273584-160-160-278627.hlt')

compressed = rp.transformJsonToCompressed(json.dumps(gameDict, sort_keys=False, indent=0))

rp.saveDataToFile("test.cmp", compressed)

t = rp.getFileData('test.cmp')
j = rp.transformCompressedToJson(t) -> Here is the error
print(j)

函数rp.parse(..)只是转换数据 - 所以它只是创建一个字典 .. rp.parse(..)函数也调用transformCompressedToJson,所以它适用于 hlt 文件。

希望你们能帮助我解决这个问题。

问候,

噪声

4

1 回答 1

2

transformJsonToCompressed()中,您将丢弃.compress()方法的结果(这可能是输出数据的大部分),而只返回结果.flush()(这将是缓冲区中剩余的最后一点数据)。使用这样的压缩库的正常方法是在生成时将每个压缩数据块直接写入输出文件。您的代码的结构不允许这样做(该函数对将写入数据的文件一无所知),因此您可以连接两个压缩数据块并返回它。

于 2018-02-27T18:49:44.483 回答