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('строка с символом €') # Символ за пределами ASCIIUnicodeEncodeError: '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.
Расширенные примеры использования
Постепенная запись большого объема данных с контролем уровня сжатия:
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 файла напрямую:
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+):
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
Использование с файловым объектом вместо имени файла:
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