Последовательный компрессор 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 вы используете?