Gzip.open: примеры (PYTHON)

Использование функции gzip.open для работы со сжатыми файлами в Python
Раздел: Сжатие, Работа с файлами
gzip.open(filename: str or bytes, mode: str = 'rb', compresslevel: int = 9, ...): _io.TextIOWrapper or gzip.GzipFile

Функция gzip.open в Python

Функция gzip.open() является частью стандартного модуля Python gzip. Она предоставляет интерфейс для работы со сжатыми файлами в формате GZIP, аналогичный встроенной функции open(). Функция используется для чтения и записи данных со сжатием, что экономит место на диске и уменьшает время передачи данных по сети.

Основные аргументы функции:

  • filename: Путь к файлу или файловый объект (объект, поддерживающий read() и write()). Может быть строкой, байтами или объектом, реализующим специальные методы файла.
  • mode: Режим открытия файла. По умолчанию 'rb'. Поддерживаются режимы чтения ('r', 'rb'), записи ('w', 'wb', 'x', 'xb'), добавления ('a', 'ab'). Буква 't' указывает на текстовый режим, 'b' - на бинарный.
  • compresslevel: Уровень сжатия от 0 до 9. Значение 0 означает отсутствие сжатия, 9 - максимальное сжатие. По умолчанию равен 9.
  • encoding: Кодировка для текстового режима. Применяется только при mode, содержащем 't'.
  • errors: Способ обработки ошибок кодирования в текстовом режиме.
  • newline: Определяет, как обрабатываются символы новой строки в текстовом режиме.

Возвращаемое значение: файловый объект типа GzipFile. В бинарном режиме это объект, поддерживающий стандартные методы файлового ввода-вывода. В текстовом режиме возвращается объект с методами для работы с текстом.

Примеры использования gzip.open

Запись данных в сжатый файл:

import gzip
content = b'Пример данных для сжатия.' * 100
with gzip.open('example.gz', 'wb', compresslevel=5) as f:
    f.write(content)
Файл example.gz создан со сжатым содержимым.

Чтение сжатого файла в бинарном режиме:

import gzip
with gzip.open('example.gz', 'rb') as f:
    data = f.read()
print(len(data))
2700

Работа в текстовом режиме:

import gzip
text = 'Текстовые данные для записи.\n' * 50
with gzip.open('text.gz', 'wt', encoding='utf-8') as f:
    f.write(text)
with gzip.open('text.gz', 'rt', encoding='utf-8') as f:
    lines = f.readlines()
print(f'Прочитано строк: {len(lines)}')
Прочитано строк: 50

Похожие функции в Python

  • gzip.GzipFile: Более низкоуровневый класс, который можно использовать для обертки существующих файловых объектов. Позволяет тонко настраивать процесс сжатия.
  • gzip.compress() и gzip.decompress(): Функции для сжатия и распаковки данных в памяти без работы с файлами. Удобны для обработки данных в оперативной памяти.
  • bz2.open, lzma.open: Функции для работы с алгоритмами сжатия BZIP2 и LZMA соответственно. Обеспечивают лучшее сжатие, но могут работать медленнее.
  • zlib: Низкоуровневая библиотека для сжатия данных. Используется, когда нужен полный контроль над процессом сжатия.

Выбор зависит от задачи: gzip.open удобна для работы с файлами, gzip.compress/decompress - для данных в памяти, bz2 и lzma - когда приоритетом является степень сжатия.

Альтернативы в других языках программирования

PHP: Функции gzopen(), gzread(), gzwrite(). Работают похожим образом, но требуют отдельного вызова для каждой операции.

$file = gzopen('example.gz', 'wb');
gzwrite($file, $content);
gzclose($file);

JavaScript (Node.js): Модуль zlib с методами createGzip() и createGunzip(), которые работают с потоками.

const zlib = require('zlib');
const fs = require('fs');
const gzip = zlib.createGzip();
const input = fs.createReadStream('input.txt');
const output = fs.createWriteStream('input.txt.gz');
input.pipe(gzip).pipe(output);

Java: Классы GZIPOutputStream и GZIPInputStream в пакете java.util.zip.

FileInputStream fis = new FileInputStream('file.txt');
FileOutputStream fos = new FileOutputStream('file.gz');
GZIPOutputStream gzipOS = new GZIPOutputStream(fos);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
    gzipOS.write(buffer, 0, len);
}
gzipOS.close();
fis.close();

Go: Пакет compress/gzip. Предоставляет типы Writer и Reader.

import "compress/gzip"
import "os"
f, _ := os.Create("output.gz")
w := gzip.NewWriter(f)
w.Write([]byte("data"))
w.Close()

Отличия от Python: в Java и Go сжатие реализовано через отдельные классы для записи и чтения, в Node.js - через потоки, что влияет на стиль программирования.

Типичные ошибки при использовании

Попытка чтения несжатого файла как сжатого:

import gzip
try:
    with gzip.open('plain_text.txt', 'rt') as f:
        content = f.read()
except OSError as e:
    print(f'Ошибка: {e}')
Ошибка: Not a gzipped file (b'\xcf\xfa')

Несоответствие режимов и типа данных:

import gzip
with gzip.open('test.gz', 'wb') as f:
    f.write('текст')  # Попытка записать строку в бинарном режиме
TypeError: a bytes-like object is required, not 'str'

Игнорирование кодировки в текстовом режиме:

import gzip
with gzip.open('test.gz', 'wt') as f:
    f.write('строка с символом €')  # Символ за пределами ASCII
UnicodeEncodeError: 'ascii' codec can't encode character '\u20ac'

Изменения в последних версиях Python

  • В Python 3.3 добавлена поддержка файловых объектов в аргументе filename.
  • Python 3.4 ввел параметр 'x' (исключительное создание) в режимах.
  • В Python 3.6 улучшена производительность для многократных вызовов write() в бинарном режиме.
  • Python 3.8 добавил параметр mtime в GzipFile для установки времени модификации в заголовке файла.
  • В Python 3.11 оптимизирована работа с уровнем сжатия 0.

Расширенные примеры использования

Постепенная запись большого объема данных с контролем уровня сжатия:

Пример python
import gzip
import os
data_chunks = [b'Chunk ' + str(i).encode() + b' ' * 1024 for i in range(1000)]
with gzip.open('large.gz', 'wb', compresslevel=1) as f:
    for chunk in data_chunks:
        f.write(chunk)
print(f'Размер сжатого файла: {os.path.getsize("large.gz")} байт')
Размер сжатого файла: 18542 байт

Чтение сжатого CSV файла напрямую:

Пример python
import gzip
import csv
with gzip.open('data.csv.gz', 'rt', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

Создание сжатого файла с установкой времени модификации (Python 3.8+):

Пример python
import gzip
from datetime import datetime
with gzip.open('stamped.gz', 'wb', mtime=datetime(2023, 1, 1).timestamp()) as f:
    f.write(b'Data')
with gzip.open('stamped.gz', 'rb') as f:
    print(f.mtime)
1672531200.0

Использование с файловым объектом вместо имени файла:

Пример python
import gzip
import io
bio = io.BytesIO()
with gzip.open(bio, 'wb') as f:
    f.write(b'Compressed in memory')
compressed = bio.getvalue()
print(f'Длина сжатых данных: {len(compressed)}')
Длина сжатых данных: 49

питон gzip.open function comments

En
Gzip.open Open a gzip-compressed file