import zlib zlib.compressobj(level=-1, method=DEFLATED, \ wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, \ strategy=Z_DEFAULT_STRATEGY[, zdict])
level=-1 - уровень сжатия,method=DEFLATED - алгоритм сжатия,wbits=MAX_WBITS - размер буфера истории,memLevel=DEF_MEM_LEVEL - управляет объемом памяти,strategy=Z_DEFAULT_STRATEGY - настройка алгоритма сжатия,zdict - предопределенный словарь сжатия.Compress.Функция compressobj() модуля zlib возвращает объект сжатия, который будет использоваться для сжатия потоков данных, которые не помещаются в память или поступают постепенно.
Уровень level - целое число от 0 до 9 или -1, управляющее уровнем сжатия.
Z_BEST_SPEED) является самым быстрым и производит наименьшее сжатие,Z_BEST_COMPRESSION) является самым медленным и производит максимальное сжатие.Z_NO_COMPRESSION) не производит сжатие.Z_DEFAULT_COMPRESSION) значение по умолчанию.Z_DEFAULT_COMPRESSION представляет компромисс по умолчанию между скоростью и сжатием, в настоящее время эквивалентен уровню 6.
Аргумент method является алгоритмом сжатия. В настоящее время единственным поддерживаемым значением является DEFLATED.
Аргумент wbits управляет размером буфера истории или "размером окна", используемым при сжатии данных и включением заголовка и трейлера в вывод. Может принимать несколько диапазонов значений, по умолчанию это MAX_WBITS равный 15:
zlib заголовок и трейлер.wbit, при этом создается необработанный выходной поток без заголовка или конечной контрольной суммы.gzip и конечную контрольную сумму.Аргумент memLevel управляет объемом памяти, используемой для внутреннего состояния сжатия. Допустимые значения находятся в диапазоне от 1 до 9. Чем выше значения, тем больше памяти, они быстрее, но дают меньшую производительность.
Аргумент strategy используется для настройки алгоритма сжатия. Возможные значения: Z_DEFAULT_STRATEGY, Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE (zlib 1.2.0.1) и Z_FIXED (zlib 1.2.2.2).
Аргумент zdict - это предопределенный словарь сжатия. Это последовательность объекта байтов, содержащая подпоследовательности, которые будут часто встречаться в данных, подлежащих сжатию. Те подпоследовательности, которые будут наиболее распространенными, должны быть в конце словаря.
Compress.Compress.compress(),Compress.flush(),Compress Compress.copy(),Compress.compress(data):Метод Compress.compress() сжимает данные data, возвращая байты, содержащие сжатые данные, по крайней мере, для части данных.
Эти данные должны быть объединены с выводом, произведенным любыми предыдущими вызовами метода zlib.compress(). Некоторые входные данные могут быть сохранены во внутренних буферах для последующей обработки.
Compress.flush([mode]):Метод Compress.flush() обрабатывает весь ожидающий ввод и возвращается байты, содержащие оставшийся сжатый вывод.
Режим mode может быть выбран из констант Z_NO_FLUSH, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_BLOCK (zlib 1.2.3.4) или Z_FINISH, по умолчанию Z_FINISH. За исключением Z_FINISH, все константы позволяют сжимать дополнительные строки данных, в то время как Z_FINISH завершает сжатый поток и предотвращает сжатие дополнительных данных.
После вызова метода Compress.flush() с режимом, установленным в Z_FINISH, метод zlib.compress() больше не может быть вызван. Единственное реалистичное действие после вызова метода Compress.flush() - удалить объект.
Compress.copy():Метод Compress.copy() возвращает копию объекта сжатия Compress. Это может быть использовано для эффективного сжатия набора данных, которые имеют общий начальный префикс.
В этом примере считываются небольшие блоки данных из простого текстового файла и передаются в метод Compress.compress(). Компрессор поддерживает внутренний буфер сжатых данных. Поскольку алгоритм сжатия зависит от контрольных сумм и минимальных размеров блока, компрессор может быть не готов возвращать данные каждый раз, когда он получает больше входных данных. Если у него нет готового сжатого блока, он возвращает пустую байтовую строку. Когда все данные введены, метод Compress.flush() заставляет компрессор закрыть последний блок и вернуть остальные сжатые данные.
import zlib, pprint, binascii # подготовим данные text = 'Привет docs-python.ru ' data = [] for _ in range(50): data.append(text * 25) # запишем данные в файл with open('sample.txt', 'w') as fp: fp.write('\n\n'.join(data)) # создадим объекта сжатия `Compress` compressor = zlib.compressobj(1) # открываем созданный файл в двоичном # режиме, читаем блоками и сжимаем with open('sample.txt', 'rb') as fp: while True: block = fp.read(4096) if block: compressed = compressor.compress(block) if compressed: print(f'Compressed: {binascii.hexlify(compressed)}') else: print('buffering...') else: break remaining = compressor.flush() print('Flushed:') pprint.pprint(binascii.hexlify(remaining), width=60) # Compressed: b'7801' # buffering... # buffering... # buffering... # buffering... # buffering... # buffering... # Flushed: # (b'edd8b10dc2401403d03e536402e6a064064640ba3e6211764042628c' # b'cb46b4747161a57a2de5e9d9df61bef66d7ee77b7ef6e77a1bd771bf' # b'3cc63afdea1dfe3c2c0b119271dc109c68d0e49270c209276e6aeba6' # b'ea137da24ff4893e4952c009279c9cf9bf977d629f2489e384134eec' # b'13fb244901279c7062c7b652a04f5a2f69c7dab1493373c20927ee8e' # b'bb93a480134e38f1bdd34a813e69bda41d6bc726cdcc09279cb83bee' # b'4e92024e38e1c4f74e2b05faa4f59276ac1d9b3433279c70e2eeb83b' # b'490a38e18413df3bad14e893d64bdab1766cd2cc9c70c289bbe3ee24' # b'29e084134e7cefb452a04f5a2f69c7dab1493373c20927ee8ebb93a4' # b'80134e38f1bdd34a813e69bda41d6bc726cdcc09279cb83bee4e9202' # b'4e38e1e4ccef9d1f21a7ea82')
Запишем сжатые данные в файл, что бы в примере функции zlib.decompressobj() изобразить поток данных из файла.
import zlib, os # создадим объекта сжатия `Compress` compressor = zlib.compressobj(1) with open('sample.txt', 'rb') as fp, \ open('sample.zl', 'wb') as fz: while True: block = fp.read(4096) if block: compressed = compressor.compress(block) if compressed: fz.write(compressed) else: break remaining = compressor.flush() fz.write(remaining) >>> os.system('file sample.zl') # sample.gzip: zlib compressed data >>> os.path.getsize('sample.txt') # 27598 >>> os.path.getsize('sample.zl') # 294