Последовательный компрессор Python bz2 создает недопустимый поток данных на низких уровнях сжатия

У меня есть ряд строк в списке под названием "линии", и я сжимаю их следующим образом:

import bz2
compressor = bz2.BZ2Compressor(compressionLevel)
for l in lines:
    compressor.compress(l)
compressedData = compressor.flush()
decompressedData = bz2.decompress(compressedData)

Когда уровень сжатия установлен на 8 или 9, это работает нормально. Если число от 1 до 7 (включительно), последняя строка завершается с ошибкой IOError: invalid data. То же самое происходит, если я использую последовательный декомпрессор. Однако если я объединю строки в одну длинную строку и использую функцию однократного сжатия, она работает нормально:

import bz2
compressedData = bz2.compress("\n".join(lines))
decompressedData = bz2.decompress(compressedData)
# Works perfectly

Знаете ли вы, почему это так и как заставить работать на более низких уровнях сжатия?

1 ответ

Решение

Вы выбрасываете сжатые данные, возвращенные compressor.compress(l)... документы говорят "Возвращает кусок сжатых данных, если это возможно, или пустую строку байтов в противном случае." Вам нужно сделать что-то вроде этого:

# setup code goes here
for l in lines:
    chunk = compressor.compress(l)
    if chunk: do_something_with(chunk)
chunk = compressor.flush()
if chunk: do_something_with(chunk)
# teardown code goes here

Также обратите внимание, что ваш код "\n".join()... чтобы проверить это по частям, используйте "".join()

Также остерегайтесь проблем с байтами /str, например, выше b"whatever".join(),

Какую версию Python вы используете?

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