Сообщить об ошибке.

Класс GzipFile() модуля gzip в Python

Чтение/запись потока данных gzip

Синтаксис:

import gzip

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

Параметры:

  • filename=None - имя файла для чтения/записи,
  • mode=None - режим открытия файла,
  • compresslevel=9 - уровень сжатия
  • fileobj=None - объект файла, если filename=None
  • mtime=None - последнее изменение в потоке при сжатии.

Возвращаемое значение:

Описание:

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

Новый экземпляр класса gzip.GzipFile основан на fileobj, который может быть потоком данных полученным при помощи функции open(), объектом io.BytesIO или любым другим объектом, имитирующим файл. По умолчанию fileobj=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 является необязательной числовой меткой времени, которая записывается в поле времени последнего изменения в потоке при сжатии. Это должно быть предоставлено только в режиме сжатия. Если mtime опущен или отсутствует, используется текущее время. Смотрите атрибут GzipFile.mtime для более подробной информации.

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

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


Дополнительные метод и атрибут объекта GzipFile.

GzipFile.peek(n):

Метод GzipFile.peek() читает n несжатых байтов без продвижения позиции файла. Для удовлетворения вызова выполняется не более одного чтения сжатого потока. Количество возвращаемых байтов может быть больше или меньше запрошенного.

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

GzipFile.mtime:

Атрибут GzipFile.mtime представляет собой время последнего изменения в последнем прочитанном заголовке. При распаковке, значение этого поля может быть прочитано как целое число. Начальное значение GzipFile.mtime перед чтением любых заголовков равно None.

Все сжатые GZIP-потоки должны содержать это поле отметки времени для совместимости с другими программами, такими как gunzip. Формат GzipFile.mtime совпадает с возвращаемым значением time.time() и атрибутом st_mtime объекта структуры времени, возвращаемого os.stat().


Пример упаковки большого файла в архив gzip:

Архивирование больших файлов, которые целиком не помещаются в память.

import gzip, os

# архивирование больших файлов, которые
# целиком не помещаются в память
with open('/usr/bin/python', 'rb') as fp, \
    gzip.GzipFile('python.gz', 'wb', compresslevel=6) as gz:
        while True:
            data = fp.read(2048)
            if data:
                gz.write(data)
            else:
                break

>>> os.system('file python.gz')
# python.gz: gzip compressed data, was "python", 
# last modified: Thu May 21 08:21:47 2020, max compression

>>> os.path.getsize('/usr/bin/python')
# 3637096
>>> os.path.getsize('python.gz')
# 1616301

Теперь распакуем бинарный файл интерпретатора Python в домашний каталог.

import gzip, os

with gzip.GzipFile('python.gz', 'rb') as gz, \
                open('python', 'wb') as fp:
        while True:
            data = gz.read(2048)
            if data:
                fp.write(data)
            else:
                break

>>> os.system('file python')
# python: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), 
# dynamically linked, interpreter /lib64/ld-linux-x86-64.so,
# BuildID[sha1]=3cf96f8293bce01076bdf858d109610a43956b, stripped

>>> x = os.path.getsize('python')
>>> os.path.getsize('/usr/bin/python')
x == y
# True