解压不适用于自己的文件

Posted

技术标签:

【中文标题】解压不适用于自己的文件【英文标题】:Decompression does not work for own file 【发布时间】:2018-02-27 18:12:38 【问题描述】:

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

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

你好,

噪音

【问题讨论】:

【参考方案1】:

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

【讨论】:

compressed = objectCompressor.compress(jsonData.encode()) return compressed + objectCompressor.flush() 像这样?

以上是关于解压不适用于自己的文件的主要内容,如果未能解决你的问题,请参考以下文章

raster::aggregate() 函数不适用于我自己的函数

图像对齐不适用于我自己的WP主题

Flutter VSCode 智能感知不适用于单文件包

媒体查询不适用于移动设备 - 电话

NodeJs:dotenv不适用于嵌套路径

Laravel 路由和 .htaccess 文件不适用于 1and1 托管