Python 3.7 zlib распакованный размер меньше, чем сжатый - PullRequest
0 голосов
/ 13 января 2019

Я написал небольшой код на python, который должен распаковывать большой двоичный файл размером ~ 180 Мб. Проблема в том, что он распаковывает только около 50 МБ. Интересно, сталкивался ли кто-нибудь с подобной, странной проблемой, подобной этой, и нашел решение для нее.

import zlib, sys
text = open('REG_E.rzp','rb').read()
print(sys.getsizeof(text))
# 187424785


decompressed = zlib.decompress(text)
print(sys.getsizeof(decompressed))
# 50001

Дополнительная информация: первые распакованные 50 Мбайт верны и читаются в шестнадцатеричном редакторе. Так что мне интересно, есть ли предел того, сколько zlib может распаковать одновременно? Я не получаю сообщений об ошибках, так что я вроде как в темноте.

Ответы [ 3 ]

0 голосов
/ 13 января 2019

По расширению файла, похоже, что оно было сжато rzip , а не gzip. Rzip использует bzip2, а не DEFLATE в zlib. Модуль Python zlib, вероятно, не может прочитать этот формат.

0 голосов
/ 13 января 2019

Проблема решена. Архив должен быть распакован файл за файлом. На изображении вы можете увидеть повторно сжатый файл и оригинал. К счастью, они выстраиваются в очередь. Строка дополняется нулями до следующего заголовка zlib: 78 DA

введите описание изображения здесь

0 голосов
/ 13 января 2019

Не похоже, что вы закрываете файлы должным образом, поэтому файлы могут записываться не полностью:

import zlib, sys
with open('REG_E.rzp','rb') as f:
    text = f.read()
    print(sys.getsizeof(text))

decompressed = zlib.decompress(text)
print(sys.getsizeof(decompressed))

with open('cecomp.bin','wb') as f:
    f.write(decompressed)

recomp = zlib.compress(decompressed)
print(sys.getsizeof(recomp))
with open('recomp.bin','wb') as f:
    f.write(recomp)

Добавление блоков with гарантирует, что вы закрываете файлы (что также гарантирует, что вы фактически закончите запись на диск).

...