Документация Python неофициальный перевод
Содержание страницы

13.2. gzip – Поддержка gzip-файловgzip – Support for gzip files

Исходный код: Lib/gzip.py


Этот модуль предоставляет простой интерфейс для сжатия и распаковки файлов, подобно тому, как это делают программы GNU gzip и gunzip.

Сжатие данных обеспечивается модулем zlib.

Модуль gzip предоставляет класс GzipFile, а также вспомогательные функции open(), compress() и decompress(). Класс GzipFile читает и записывает файлы в формате gzip, автоматически сжимая или распаковывая данные, так что они выглядят как обычный файловый объект.

Обратите внимание, что дополнительные форматы файлов, которые могут быть распакованы программами gzip и gunzip, например, созданные программами compress и pack, не поддерживаются этим модулем.

Модуль определяет следующие элементы:

gzip.open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)

Открывает файл, сжатый gzip, в двоичном или текстовом режиме и возвращает файловый объект.

Аргумент filename может быть фактическим именем файла (объект str или bytes), или существующим файловым объектом для чтения или записи.

Аргумент mode может быть любым из 'r', 'rb', 'a', 'ab', 'w', 'wb', 'x' или 'xb' для двоичного режима, или 'rt', 'at', 'wt', или 'xt' для текстового режима. По умолчанию 'rb'.

Аргумент compresslevel – целое число от 0 до 9, как в конструкторе GzipFile.

Для двоичного режима эта функция эквивалентна конструктору GzipFile: GzipFile(filename, mode, compresslevel). В этом случае аргументы encoding, errors и newline указывать нельзя.

Для текстового режима создаётся объект GzipFile, который оборачивается в экземпляр io.TextIOWrapper с указанной кодировкой, стратегией обработки ошибок и символами конца строки.

Изменено в версии 3.3: Добавлена поддержка filename в качестве файлового объекта, поддержка текстового режима, и аргументов encoding, errors и newline.

Изменено в версии 3.4: Добавлена поддержка режимов 'x', 'xb' и 'xt'.

class gzip.GzipFile(filename=None, mode=None, compresslevel=9, fileobj=None, mtime=None)

Конструктор класса GzipFile, который имитирует большинство методов файлового объекта, за исключением метода truncate(). По крайней мере один из аргументов fileobj или filename должен иметь нетривиальное значение.

Новый экземпляр класса основывается на fileobj, который может быть обычным файлом, объектом io.BytesIO или любым другим объектом, имитирующим файл. По умолчанию None, и в этом случае filename открывается для получения файлового объекта.

Если fileobj не равен None, аргумент filename используется только для включения в заголовок файла gzip, который может содержать исходное имя файла без сжатия. По умолчанию он равен имени файла fileobj, если его можно определить; в противном случае по умолчанию используется пустая строка, и в этом случае исходное имя файла не включается в заголовок.

Аргумент mode может быть любым из 'r', 'rb', 'a', 'ab', 'w', 'wb', 'x' или 'xb', в зависимости от того, будет ли файл читаться или записываться. По умолчанию используется режим fileobj, если его можно определить; в противном случае по умолчанию 'rb'.

Обратите внимание, что файл всегда открывается в двоичном режиме. Чтобы открыть сжатый файл в текстовом режиме, используйте open() (или оберните свой GzipFile с помощью io.TextIOWrapper).

Аргумент compresslevel – целое число от 0 до 9, управляющее уровнем сжатия; 1 – самый быстрый и даёт наименьшее сжатие, а 9 – самый медленный и даёт наибольшее сжатие. 0 – это отсутствие сжатия. По умолчанию 9.

Аргумент mtime – необязательная числовая метка времени, которая записывается в поток при сжатии. Все сжатые потоки gzip должны содержать метку времени. Если она опущена или равна None, используется текущее время. Этот модуль игнорирует метку времени при распаковке; однако некоторые программы, такие как gunzip, используют её. Формат метки времени такой же, как у возвращаемого значения time.time() и атрибута st_mtime объекта, возвращаемого os.stat().

Вызов метода close() объекта GzipFile не закрывает fileobj, так как может потребоваться добавить данные после сжатого содержимого. Это также позволяет передать объект io.BytesIO, открытый для записи, в качестве fileobj, и получить результирующий буфер памяти с помощью метода io.BytesIO getvalue().

GzipFile поддерживает интерфейс io.BufferedIOBase, включая итерацию и оператор with. Не реализован только метод truncate().

GzipFile также предоставляет следующий метод:

peek([n])

Читает n несжатых байтов без изменения позиции в файле. Для выполнения вызова производится не более одного чтения из сжатого потока. Возвращаемое количество байтов может быть больше или меньше запрошенного.

Примечание

Хотя вызов peek() не изменяет файловую позицию объекта GzipFile, он может изменить позицию базового файлового объекта (например, если GzipFile был создан с параметром fileobj).

Новое в версии 3.2.

Изменено в версии 3.1: Добавлена поддержка оператора with, а также аргумента mtime.

Изменено в версии 3.2: Добавлена поддержка файлов с дополнением нулями и непозиционируемых файлов.

Изменено в версии 3.3: Теперь реализован метод io.BufferedIOBase.read1().

Изменено в версии 3.4: Добавлена поддержка режимов 'x' и 'xb'.

gzip.compress(data, compresslevel=9)

Сжимает data и возвращает объект bytes, содержащий сжатые данные. compresslevel имеет то же значение, что и в конструкторе GzipFile выше.

Новое в версии 3.2.

gzip.decompress(data)

Распаковывает data и возвращает объект bytes, содержащий несжатые данные.

Новое в версии 3.2.

13.2.1. Примеры использованияExamples of usage

Пример чтения сжатого файла:

import gzip
with gzip.open('/home/joe/file.txt.gz', 'rb') as f:
    file_content = f.read()

Пример создания сжатого файла GZIP:

import gzip
content = b"Lots of content here"
with gzip.open('/home/joe/file.txt.gz', 'wb') as f:
    f.write(content)

Пример сжатия существующего файла в формате GZIP:

import gzip
with open('/home/joe/file.txt', 'rb') as f_in:
    with gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:
        f_out.writelines(f_in)

Пример сжатия бинарной строки в формате GZIP:

import gzip
s_in = b"Lots of content here"
s_out = gzip.compress(s_in)

См. также

Модуль zlib
Базовый модуль сжатия данных, необходимый для поддержки формата файлов gzip.