zipfile — Работа с ZIP-архивами
Модуль zipfile предоставляет инструменты для создания, чтения, дополнения и распаковки стандартных ZIP архивов. Поддерживает работу с алгоритмами сжатия (Deflate, LZMA, BZIP2).
import zipfile
Создание архива
Для того чтобы файлы действительно сгжимались (а не просто собирались в одну папку), обязательно нужно передать флаг компрессии, например ZIP_DEFLATED.
import zipfile
# 'w' - означает создание нового архива (сотрет старый, если есть)
with zipfile.ZipFile('backup.zip', 'w', compression=zipfile.ZIP_DEFLATED) as zf:
# Первый аргумент - локальный файл;
# Второй аргумент - имя, под которым он сохранится внутри архива.
zf.write('document.txt', 'docs/doc.txt')
zf.write('image.png', 'assets/image.png')
Распаковка архива
import zipfile
# 'r' - режим чтения
with zipfile.ZipFile('backup.zip', 'r') as zf:
# Вывести список всех файлов внутри
print(zf.namelist())
# Полная распаковка в папку `extracted/`
zf.extractall('extracted/')
Чтение прямиком в память
Вы можете прочитать содержимое конкретного файла без необходимости распаковывать архив на жесткий диск.
import zipfile
with zipfile.ZipFile('backup.zip', 'r') as zf:
info = zf.getinfo('docs/doc.txt')
print(f"Размер без сжатия: {info.file_size} байт")
# Чтение как бинарного файла
with zf.open('docs/doc.txt') as file:
text = file.read().decode('utf-8')
print(text)
Полный справочник API (API Reference)
Класс ZipFile
| Метод | Описание |
|---|---|
zipfile.ZipFile(file, mode='r', compression=ZIP_STORED) |
Открывает архив. Режимы: r (чтение), w (перезапись), a (дополнение существующего архива - Append). |
ZipFile.close() |
Закрывает файл архива (вызывается автоматически при завершении блока with). |
ZipFile.getinfo(name) |
Возвращает объект ZipInfo (информацию о весе и дате конкретного файла внутри архива). |
ZipFile.namelist() |
Вовзращает список строк — структуру всех файлов внутри архива. |
ZipFile.open(name, mode='r') |
Открывает конкретный файл внутри архива для "потокового" чтения на лету. |
ZipFile.extract(member, path=None) |
Скачивает и распаковывает ОДИН конкретный файл из архива в папку path. |
ZipFile.extractall(path=None) |
Полная распаковка всех файлов папки и суб-директорий на жесткий диск в папку path. |
ZipFile.read(name) |
Быстро загружает и возвращает весь файл name в виде единой строки bytes. |
ZipFile.write(filename, arcname) |
Записывает реальный файл filename с жесткого диска в архив под именем arcname. |
ZipFile.writestr(arcname, data) |
Создает новый текстовый файл архиве "на лету" из переданной строки data в оперативной памяти. |
Константы сжатия
| Константа | Описание |
|---|---|
zipfile.ZIP_STORED |
Архивирование без сжатия (по умолчанию). |
zipfile.ZIP_DEFLATED |
Стандартный и самый частый метод сжатия ZIP (для него библиотека требует наличие модуля zlib). |
zipfile.ZIP_LZMA |
Метод сжатия с наивысшей степенью компрессии. |