解压对自己的文件不起作用
Decompression does not work for own file
我是 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(..) 只是 t运行 形成数据 - 所以它只是创建字典.. rp.parse(..) 函数也调用 t运行sformCompressedToJson,所以它对 hlt 文件工作正常。
希望你们能帮我解决这个问题。
问候,
诺克斯
在 transformJsonToCompressed()
中,您将丢弃 .compress()
方法的结果(这可能是输出数据的主体),而仅 returning .flush()
的结果(这只是缓冲区中剩余的最后一点数据)。使用像这样的压缩库的正常方法是在生成每个压缩数据块时将其直接写入输出文件。您的代码的结构不允许这样做(该函数对数据将写入的文件一无所知),因此您可以连接两个压缩数据块和 return that.
我是 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(..) 只是 t运行 形成数据 - 所以它只是创建字典.. rp.parse(..) 函数也调用 t运行sformCompressedToJson,所以它对 hlt 文件工作正常。
希望你们能帮我解决这个问题。
问候,
诺克斯
在 transformJsonToCompressed()
中,您将丢弃 .compress()
方法的结果(这可能是输出数据的主体),而仅 returning .flush()
的结果(这只是缓冲区中剩余的最后一点数据)。使用像这样的压缩库的正常方法是在生成每个压缩数据块时将其直接写入输出文件。您的代码的结构不允许这样做(该函数对数据将写入的文件一无所知),因此您可以连接两个压缩数据块和 return that.