Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Работа с gzip


Автор: Isaev 14.4.2013, 09:48
Доброго времени суток
Получаю данные от сервера, в заголовке
Код

Accept-Encoding:gzip,deflate,sdch

Значит данные приходят в gzip как я понял? (или просто zlib надо использовать?)
данные всегда с сигнатурой "78 DA"(compression extreme) по идее это zlib должен быть... или у gzip тоже такая сигнатура? 
читаю в файл, потом пытаюсь перекодировать. в python чайник
полазил по просторам сети, нашёл что-то типа(python 3): 
Код

import io,gzip

a=open('test.txt','rb')
z=a.read()
a.close()
zbuf = io.StringIO(z)
zfile = gzip.GzipFile(mode='rb', fileobj=zbuf)
zfile.read()
zfile.close()
f=open('out.txt','wb')
f.write(zbuf)
f.close()

но оно не работает (пока), т.к. мало понимаю как работает StringIO вообще и зачем он тут
да и вообще то ли я делаю?

для примера входной файл "78 DA 33 34 32 36 31 35 33 B7 00 00 07 40 01 A5" бинарный конечно
на выходе должна быть строка "12345678"

Автор: Isaev 14.4.2013, 18:41
Ребят, ну исправьте глупую ошибочку.... каждый третий наверняка видит, не бойтесь советовать, я попробую ;)

Автор: Backward 15.4.2013, 04:51
Как-то так должно работать
Код

import zlib

def decompress(data, mode="gzip"):
    zlib_mode = 16 + zlib.MAX_WBITS if mode == 'gzip' else -zlib.MAX_WBITS
    dec = zlib.decompressobj(zlib_mode)
    return dec.decompress(data)

with open("test.txt", "rb") as fin, open("out.txt", "wb") as fout:
    fout.write(decompress(fin.read()))

Автор: Isaev 16.4.2013, 04:06
Backward, не компилируется немного... а вообще задумка мне нравится
Код

Traceback (most recent call last):
  File "unitest.py", line 8, in <module>
    fout.write(decompress(fin.read()))
  File "unitest.py", line 6, in decompress
    return dec.decompress(data)
zlib.error: Error -3 while decompressing data: incorrect header check

Автор: Backward 17.4.2013, 02:56
Для данных, которые Вы привели, работает так:
Код

import zlib
with open("test.txt", "rb") as fin, open("out.txt", "wb") as fout:
    fout.write(zlib.decompress(fin.read()))

Автор: Isaev 17.4.2013, 14:58
Backward, благодарю, работает smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)