解压缩不适用于自己的文件

时间:2018-02-27 18:12:38

标签: python zstandard

我是python编程语言的新手,我遇到了zstandard模块的问题。 我目前正在处理Halite的重播文件。 由于它们是用zstandard压缩的,我必须使用这个模块。如果我读了一个文件,一切都很好!我可以解压缩" .hlt"文件。

但是我已经完成了一些json数据的转换,我希望将其保存在磁盘上以便以后使用。我发现再次压缩数据非常有用,所以我使用了压缩器。压缩效果也很好。但是,如果我打开刚刚创建的文件,我会收到一条错误消息:" zstd.ZstdError:解压缩错误:未知的帧描述符"。

查看下面的代码:

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文件工作正常。

希望你们可以帮助我。

Greethings,

Noixes

1 个答案:

答案 0 :(得分:2)

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