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

Класс ZipFile() модуля zipfile в Python

Извлечь файлы, создать ZIP/BZIP2/LZMA архив

Синтаксис:

import zipfile

zf = zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, \
                     allowZip64=True, compresslevel=None, *, \
                     strict_timestamps=True, metadata_encoding=None)

Параметры:

  • file - имя ZIP-файла,
  • mode='r' - режим открытия ZIP-файла,
  • compression=ZIP_STORED - метод/алгоритм сжатия,
  • allowZip64=True - расширение ZIP64,
  • compresslevel=None - уровень сжатия,
  • strict_timestamps=True - позволяет архивировать файлы старше 1980-01-01,
  • metadata_encoding=None - (добавлен в Python 3.11) обходной путь для устаревших реализаций (подробности ниже)

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

Описание:

Функция ZipFile() модуля zipfile открывает файл ZIP, где файл может быть строкой, обозначающей путь к файлу, объектом, похожем на путь или файловым объектом.

Параметр mode должен иметь значение:

  • r для чтения существующего файла,
  • w для усечения и записи нового файла,
  • a для добавления к существующему файлу
  • x исключительно для создания и записи нового файла.

Поведение аргумента mode в сочетании с file:

  • Если mode='x' и файл file ссылается на существующий файл, будет вызвана ошибка FileExistsError.
  • Если mode='a' и файл file ссылается на существующий ZIP-файл, то к нему добавляются дополнительные файлы. Если файл file не ссылается на ZIP-файл, то к нему добавляется новый ZIP-архив. Это предназначено для добавления ZIP-архива в другой файл (например python.exe).
  • Если mode='a', а файл file вообще не существует, то он создается.
  • Если режим mode установлен как 'r' или 'a', то файл должен быть доступен для чтения.

Аргумент compression - это метод сжатия ZIP, используемый при записи архива, и должен быть zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED, zipfile.ZIP_BZIP2 или zipfile.ZIP_LZMA. Не распознанные значения вызовут исключение NotImplementedError. Если указан zipfile.ZIP_DEFLATED, zipfile.ZIP_BZIP2 или zipfile.ZIP_LZMA, но соответствующий модуль zlib, bz2 или lzma недоступен, возникает исключение RuntimeError. По умолчанию используется zipfile.ZIP_STORED.

Если значение аргумента allowZip64=True (по умолчанию), а размер zip-файла больше 4 ГиБ, то будет создаваться ZIP-файл, который использует расширение ZIP64. Если allowZip64=False, то модуль zipfile вызовет исключение, когда ZIP-файл потребует расширения ZIP64.

Параметр compresslevel управляет уровнем сжатия, используемым при записи файлов в архив. При использовании zlib.ZIP_STORED или zlib.ZIP_LZMA это не имеет никакого эффекта.

Аргумент strict_timestamps=False позволяет архивировать файлы старше 1980-01-01 за счет установки метки времени в 1980-01-01. Аналогичное поведение происходит с файлами более ранних, чем 2107-12-31, отметка времени также установлена ​​на ограничение.

Если файл file создается в режиме w, x или a, а затем закрывается без добавления каких-либо файлов в архив, то создается пустой файл архива ZIP.

Класс zipfile.ZipFile() также является контекстным менеджером и поэтому поддерживает оператор with. В примере ниже объект myzip закрывается после завершения набора инструкций with, даже если возникает исключение:

with ZipFile('spam.zip', 'w') as myzip:
    myzip.write('eggs.txt')

Обратите внимание, что аргумент metadata_encoding - это параметр для всего экземпляра ZipFile. В настоящее время невозможно установить это для каждого члена архива.

Этот аргумент является обходным путем для устаревших реализаций, которые создают архивы с именами в кодировке текущей локали или кодовой странице (в основном в Windows). В соответствии со стандартом ZIP кодировка метаданных может быть указана как кодовая страница IBM (по умолчанию) или UTF-8 с помощью флага в заголовке архива. Этот флаг имеет приоритет над metadata_encoding, которое является специфичным для Python расширением.

Новое в Python 3.8: Аргумент только для ключевого слова strict_timestamps

Новое в Python 3.11: добавлена ​​поддержка указания кодировки имени элемента для чтения метаданных в каталоге zip-файла и заголовках файлов.

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

Создание архива каталога с файлами. Для дополнительной информации смотрите раздел "Описание методов объекта ZipFile".

import zipfile, os

path = '/home/docs-python/script/sql-script/'
file_dir = os.listdir(path)

with zipfile.ZipFile('test.zip', mode='x', \
                     compression=zipfile.ZIP_DEFLATED) as zf:
    for file in file_dir:
        add_file = os.path.join(path, file)
        zf.write(add_file)

>>> os.system('file test.zip')
# test.zip: Zip archive data, at least v2.0 to extract

Извлечение всех файлов из архива в определенный каталог.

import zipfile, glob

extract_dir = 'extract_dir'

with zipfile.ZipFile('test.zip') as zf:
    zf.extractall(extract_dir)

>>> for file in glob.glob(extract_dir + '/**', recursive=True):
...    print(file)
...
# home/docs-python/script/sql-script/Script-5.sql
# home/docs-python/script/sql-script/Script-1.sql
# home/docs-python/script/sql-script/Script-3.sql
# home/docs-python/script/sql-script/procedure.sql
# home/docs-python/script/sql-script/Script-2.sql
# home/docs-python/script/sql-script/Script-4.sql