Распаковка не работает для собственного файла
Я действительно плохо знаком с языком программирования 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 ответ
В transformJsonToCompressed()
вы выбрасываете результат .compress()
метод (который, вероятно, будет основная часть выходных данных), и вместо этого возвращает только результат .flush()
(который будет последним маленьким кусочком данных, оставшихся в буферах). Обычный способ использовать библиотеку сжатия, подобную этой, - записывать каждый кусок сжатых данных непосредственно в выходной файл по мере его создания. Ваш код не имеет такой структуры (функция ничего не знает о файле, в который будут записываться данные), поэтому вместо этого вы можете объединить два фрагмента сжатых данных и вернуть их.