Распаковка с использованием gzip -d - это нормально, но неправильно при использовании zlib в Python - PullRequest
1 голос
/ 06 июля 2019

Я скачал файл .gz и успешно распаковал его, используя 'gzip -d'. Но все пошло не так, когда я попытался распаковать его, используя python zlib by chunk.

CHUNK = 1024 * 1024
infile = open('2019-07-06-13.log.gz')
d = zlib.decompressobj(32 + zlib.MAX_WBITS)
while True:
    chunk = infile.read(CHUNK)
    if not chunk:
        break
    data = d.decompress(chunk)
    print len(chunk), len(data)
print "#####"

Поскольку файл небольшой, этот цикл будет выполняться только время. Результат печати, который «len (data)» меньше чем «len (chunk)», безусловно, неверен.

Выход:

100576 50389
#####

Между тем, после того, как я использовал gzip -c для повторного сжатия распакованного файла, который я создал с помощью "gzip -d", как я уже говорил, я использовал свой код для распаковки повторно сжатого файла, и результирующая линза оказалась направо, что означает мой код хорошо работает для обычного gz-файла .

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Спасибо за подсказку от DavisHerring! Ключевая проблема заключается в том, что исходный файл gz объединяется из нескольких вложенных файлов gz, что делает его распаковку немного более сложной.

Вот решение:

 CHUNK = 1024 * 1024
 infile = open('2019-07-06-13.log.gz')
 d = zlib.decompressobj(32 + zlib.MAX_WBITS)

 while True:
    chunk = response.read(CHUNK)

    if not chunk:
           break

    data = d.decompress(chunk)
    print len(chunk), len(data)

    while d.unused_data != '':
       buf = d.unused_data
       d = zlib.decompressobj( zlib.MAX_WBITS |16)
       data = d.decompress(buf)
       print len(buf), len(data)
0 голосов
/ 09 июля 2019

формат gzip отличается от формата zlib:

Почему gzip выдает ошибку в файле, который я создаю с помощью сжатия / сжатия? Функции сжатия и сжатия выдают данные в формате zlib, который отличается и несовместим с форматом gzip. Функции gz * в zlib, с другой стороны, используют формат gzip. Оба формата zlib и gzip используют один и тот же формат сжатых данных внутри, но имеют разные заголовки и трейлеры вокруг сжатых данных. Источник: zlib.net

Для распаковки файлов .gz вы должны использовать встроенный модуль gzip .

...