На этом шаге мы рассмотрим использование модулей gzip и bz2.
Вам нужно прочесть или записать данные в файл, сжатый gzip или bz2.
Модули gzip и bz2 делают работу с такими файлами очень легкой. Оба модуля предоставляют альтернативную реализацию функции open(). Например, чтобы прочесть сжатые файлы как текст, сделайте так:
# Сжатие с помощью gzip import gzip with gzip.open('somefile.gz', 'rt') as f: text = f.read() # Сжатие с помощью bz2 import bz2 with bz2.open('somefile.bz2', 'rt') as f: text = f.read()
Как показано выше, весь ввод и вывод будет использовать текст и проводить кодирование/декодирование в Unicode. Если же вы хотите работать с
бинарными данными, используйте файловый режим rb или wb.
Чтение и запись сжатых данных по большей части просты. Однако стоит знать, что выбор правильного файлового режима критически важен. Если вы не обозначите режим явно, то будет выбран режим по умолчанию, то есть бинарный, а это сломает программы, которые ожидают получить текст. Функции gzip.open() и bz2.open() принимают те же параметры, что и встроенная функция open(), включая encoding, errors, newline и т. д.
При записи сжатых данных с помощью необязательного именованного аргумента compresslevel может быть установлен уровень компрессии. Например:
with gzip.open('somefile.gz', 'wt', compress1eve1=5) as f: f.write(text)
Уровень по умолчанию - это 9, то есть наивысший. Более низкие уровни увеличивают скорость, но снижают степень сжатия данных.
И последнее: малоизвестная особенность gzip.open() и bz2.open() заключается в том, что они могут работать уровнем выше существующего файла, открытого в бинарном режиме. Например, такой код работает:
import gzip f = open('somefile.gz', 'rb') with gzip.open(f, 'rt') as g: text = g.read()
Это позволяет модулям gzip и bz2 работать с различными файлоподобными объектами, такими как сокеты, каналы и файлы в оперативной памяти.
На следующем шаге мы рассмотрим итерирование по записям фиксированного размера.