Распаковка не работает для собственного файла

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

Другие вопросы по тегам