zipfile — Работа с ZIP-архивами

Источник: Lib/zipfile/


Формат файлов ZIP - это распространенный стандарт архивирования и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и списывания ZIP-файлов. Любое расширенное использование этого модуля потребует понимания формата, как определено в PKZIP Application Note.

В настоящее время этот модуль не работает с многодисковыми ZIP-файлами. Он может работать с ZIP-файлами, использующими расширения ZIP64 (то есть с ZIP-файлами размером более 4 Гб). Он поддерживает расшифровку зашифрованных файлов в ZIP-архивах, но в настоящее время не может создать зашифрованный файл. Расшифровка происходит крайне медленно, так как она реализована на родном языке Python, а не C.

Модуль определяет следующие элементы:

exception zipfile.BadZipFile

Ошибка, возникающая при обнаружении плохих ZIP-файлов.

Added in version 3.2.

exception zipfile.BadZipfile

Псевдоним BadZipFile, для совместимости со старыми версиями Python.

Не рекомендуется, начиная с версии 3.2.

exception zipfile.LargeZipFile

Ошибка возникала, когда для ZIP-файла требовалась функциональность ZIP64, но она не была включена.

class zipfile.ZipFile

Класс для чтения и записи файлов ZIP. Подробности о конструкторе см. в разделе Объекты ZipFile.

class zipfile.Path

Класс, реализующий подмножество интерфейса, предоставляемого pathlib.Path, включая полный интерфейс importlib.resources.abc.Traversable.

Added in version 3.8.

class zipfile.PyZipFile

Класс для создания ZIP-архивов, содержащих библиотеки Python.

class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))

Класс, используемый для представления информации о члене архива. Экземпляры этого класса возвращаются методами getinfo() и infolist() объектов ZipFile. Большинству пользователей модуля zipfile не потребуется их создавать, они будут использовать только те, которые созданы этим модулем. filename должно быть полным именем члена архива, а date_time должен быть кортежем, содержащим шесть полей, описывающих время последней модификации файла; поля описаны в разделе Объекты ZipInfo.

Изменено в версии 3.13: Атрибут public compress_level был добавлен для раскрытия ранее защищенного _compresslevel. Старое защищенное имя продолжает работать как свойство для обратной совместимости.

zipfile.is_zipfile(filename)

Возвращает True, если filename является действительным ZIP-файлом на основе его магического номера, в противном случае возвращает False. filename также может быть файлом или файлоподобным объектом.

Изменено в версии 3.1: Поддержка файлов и файлоподобных объектов.

zipfile.ZIP_STORED

Числовая константа для несжатого члена архива.

zipfile.ZIP_DEFLATED

Числовая константа для обычного метода сжатия ZIP. Для этого требуется модуль zlib.

zipfile.ZIP_BZIP2

Числовая константа для метода сжатия BZIP2. Для этого требуется модуль bz2.

Added in version 3.3.

zipfile.ZIP_LZMA

Числовая константа для метода сжатия LZMA. Для этого требуется модуль lzma.

Added in version 3.3.

Примечание

С 2001 года спецификация формата ZIP включает поддержку сжатия bzip2, а с 2006 года - сжатия LZMA. Однако некоторые инструменты (включая старые версии Python) не поддерживают эти методы сжатия и могут либо вообще отказаться обрабатывать ZIP-файл, либо не извлечь отдельные файлы.

См.также

PKZIP Application Note

Документация по формату файлов ZIP от Фила Каца, создателя формата и используемых алгоритмов.

Info-ZIP Home Page

Информация о программах и библиотеках разработки ZIP-архивов проекта Info-ZIP.

Объекты ZipFile

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

Откройте ZIP-файл, где file может быть путем к файлу (строкой), файлоподобным объектом или path-like object.

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

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

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

Параметр compresslevel определяет уровень сжатия, который будет использоваться при записи файлов в архив. При использовании ZIP_STORED или ZIP_LZMA он не имеет значения. При использовании ZIP_DEFLATED принимаются целые числа от 0 до 9 (см. zlib для дополнительной информации). При использовании ZIP_BZIP2 принимаются целые числа от 1 до 9 (см. bz2 для получения дополнительной информации).

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

Когда режим равен 'r', metadata_encoding может быть задано имя кодека, который будет использоваться для декодирования метаданных, таких как имена участников и комментарии к ZIP.

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

ZipFile также является менеджером контекста и поэтому поддерживает оператор with. В примере myzip закрывается после завершения набора операторов with - даже если возникает исключение:

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

Примечание

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

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

Изменено в версии 3.2: Добавлена возможность использовать ZipFile в качестве менеджера контекста.

Изменено в версии 3.3: Добавлена поддержка сжатия bzip2 и lzma.

Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.

Изменено в версии 3.5: Добавлена поддержка записи в не просматриваемые потоки. Добавлена поддержка режима 'x'.

Изменено в версии 3.6: Ранее для нераспознанных значений сжатия выдавался обычный RuntimeError.

Изменено в версии 3.6.2: Параметр file принимает значение path-like object.

Изменено в версии 3.7: Добавьте параметр compresslevel.

Изменено в версии 3.8: Параметр strict_timestamps только для ключевого слова.

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

ZipFile.close()

Закрыть архивный файл. Вы должны вызвать close() перед выходом из программы, иначе основные записи не будут записаны.

ZipFile.getinfo(name)

Возвращает объект ZipInfo с информацией о члене архива name. Вызов getinfo() для имени, не содержащегося в архиве, вызовет ошибку KeyError.

ZipFile.infolist()

Возвращает список, содержащий объект ZipInfo для каждого члена архива. Объекты располагаются в том же порядке, что и их записи в реальном ZIP-файле на диске, если был открыт существующий архив.

ZipFile.namelist()

Возвращает список членов архива по имени.

ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)

Доступ к члену архива как к двоичному файлоподобному объекту. name может быть либо именем файла в архиве, либо объектом ZipInfo. Параметр mode, если он включен, должен быть 'r' (по умолчанию) или 'w'. pwd - это пароль, используемый для расшифровки зашифрованных ZIP-файлов, в виде объекта bytes.

open() также является менеджером контекста и поэтому поддерживает утверждение with:

with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())

При режиме 'r' файлоподобный объект (ZipExtFile) доступен только для чтения и предоставляет следующие методы: read(), readline(), readlines(), seek(), tell(), __iter__(), __next__(). Эти объекты могут работать независимо от ZipFile.

При значении mode='w' возвращается дескриптор файла с возможностью записи, который поддерживает метод write(). Пока открыт дескриптор файла с возможностью записи, попытка чтения или записи других файлов в ZIP-файле вызовет ошибку ValueError.

В обоих случаях файлоподобный объект имеет также атрибуты name, который эквивалентен имени файла в архиве, и mode, который является 'rb' или 'wb' в зависимости от режима ввода.

При записи файла, если его размер заранее неизвестен, но может превышать 2 Гб, передайте force_zip64=True, чтобы убедиться, что формат заголовка способен поддерживать большие файлы. Если размер файла известен заранее, создайте объект ZipInfo с установленным значением file_size и используйте его в качестве параметра name.

Примечание

Методы open(), read() и extract() могут принимать имя файла или объект ZipInfo. Вы оцените это при попытке прочитать ZIP-файл, содержащий члены с дублирующимися именами.

Изменено в версии 3.6: Убрана поддержка mode='U'. Используйте io.TextIOWrapper для чтения сжатых текстовых файлов в режиме universal newlines.

Изменено в версии 3.6: ZipFile.open() теперь можно использовать для записи файлов в архив с опцией mode='w'.

Изменено в версии 3.6: Вызов open() на закрытом ZipFile приведет к появлению ValueError. Ранее вызывалась ошибка RuntimeError.

Изменено в версии 3.13: Добавлены атрибуты name и mode для файлоподобного объекта с возможностью записи. Значение атрибута mode для читаемого файлоподобного объекта изменено с 'r' на 'rb'.

ZipFile.extract(member, path=None, pwd=None)

Извлечение члена из архива в текущий рабочий каталог; member должно быть его полным именем или объектом ZipInfo. Информация о файле извлекается как можно точнее. path указывает другой каталог для извлечения. member может быть именем файла или объектом ZipInfo. pwd - пароль, используемый для зашифрованных файлов, как объект bytes.

Возвращает созданный нормализованный путь (каталог или новый файл).

Примечание

Если имя файла-члена представляет собой абсолютный путь, то drive/UNC sharepoint и ведущие (обратные) косые черты будут удалены, например: ///foo/bar становится foo/bar на Unix, а C:\foo\bar становится foo\bar на Windows. И все компоненты ".." в имени файла-члена будут удалены, например: ../../foo../../ba..r становится foo../ba..r. В Windows недопустимые символы (:, <, >, |, ", ? и *) заменены на знак подчеркивания (_).

Изменено в версии 3.6: Вызов extract() на закрытом ZipFile приведет к появлению ValueError. Ранее вызывалась ошибка RuntimeError.

Изменено в версии 3.6.2: Параметр path принимает значение path-like object.

ZipFile.extractall(path=None, members=None, pwd=None)

Извлечь все члены из архива в текущий рабочий каталог. path указывает другой каталог для извлечения. members необязателен и должен быть подмножеством списка, возвращаемого namelist(). pwd - пароль, используемый для зашифрованных файлов, как объект bytes.

Предупреждение

Никогда не извлекайте архивы из ненадежных источников без предварительной проверки. Возможно создание файлов вне path, например, членов с абсолютными именами, начинающимися с "/", или с именами с двумя точками "..". Данный модуль пытается предотвратить это. См. примечание extract().

Изменено в версии 3.6: Вызов extractall() на закрытом ZipFile приведет к появлению ValueError. Ранее вызывалась ошибка RuntimeError.

Изменено в версии 3.6.2: Параметр path принимает значение path-like object.

ZipFile.printdir()

Выведите оглавление архива на sys.stdout.

ZipFile.setpassword(pwd)

Установите pwd (объект bytes) в качестве пароля по умолчанию для извлечения зашифрованных файлов.

ZipFile.read(name, pwd=None)

Возвращает количество байт файла name в архиве. name - это имя файла в архиве или объект ZipInfo. Архив должен быть открыт для чтения или добавления. pwd - это пароль, используемый для зашифрованных файлов, как объект bytes, и если он указан, то отменяет пароль по умолчанию, установленный с помощью setpassword(). Вызов read() для ZipFile, использующего метод сжатия, отличный от ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2 или ZIP_LZMA, приведет к ошибке NotImplementedError. Также будет выдана ошибка, если соответствующий модуль сжатия недоступен.

Изменено в версии 3.6: Вызов read() на закрытом ZipFile приведет к появлению ValueError. Ранее вызывалась ошибка RuntimeError.

ZipFile.testzip()

Прочитайте все файлы в архиве и проверьте их CRC и заголовки файлов. Верните имя первого плохого файла, иначе верните None.

Изменено в версии 3.6: Вызов testzip() на закрытом ZipFile приведет к появлению ValueError. Ранее вызывалась ошибка RuntimeError.

ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)

Запишите файл с именем filename в архив, присвоив ему имя архива arcname (по умолчанию это будет то же самое, что и filename, но без буквы диска и с удаленными ведущими разделителями путей). Если задано, compress_type переопределяет значение параметра compression в конструкторе новой записи. Аналогично, compresslevel переопределяет конструктор, если задан. Архив должен быть открыт в режиме 'w', 'x' или 'a'.

Примечание

Стандарт файлов ZIP исторически не определял кодировку метаданных, но настоятельно рекомендовал CP437 (оригинальная кодировка для IBM PC) для обеспечения совместимости. Последние версии позволяют использовать UTF-8 (только). В этом модуле UTF-8 будет автоматически использоваться для записи имен участников, если они содержат любые не-ASCII символы. Невозможно записать имена членов в кодировке, отличной от ASCII или UTF-8.

Примечание

Имена архивов должны быть относительными к корню архива, то есть они не должны начинаться с разделителя путей.

Примечание

Если arcname (или filename, если arcname не задан) содержит нулевой байт, имя файла в архиве будет обрезано на нулевом байте.

Примечание

Ведущая косая черта в имени файла может привести к тому, что архив будет невозможно открыть в некоторых программах zip на системах Windows.

Изменено в версии 3.6: Вызов write() на ZipFile, созданном с режимом 'r', или на закрытом ZipFile приведет к появлению сообщения ValueError. Ранее вызывалась ошибка RuntimeError.

ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)

Записать файл в архив. Содержимым является data, которая может быть либо экземпляром str, либо bytes; если это str, то сначала она кодируется как UTF-8. zinfo_or_arcname - это либо имя файла, которое он получит в архиве, либо экземпляр ZipInfo. Если это экземпляр, то должны быть указаны как минимум имя файла, дата и время. Если это имя, то дата и время устанавливаются на текущую дату и время. Архив должен быть открыт в режиме 'w', 'x' или 'a'.

Если задано, compress_type переопределяет значение параметра compression в конструкторе новой записи или в zinfo_or_arcname (если это экземпляр ZipInfo). Аналогично, compresslevel переопределяет значение конструктора, если оно задано.

Примечание

При передаче экземпляра ZipInfo в качестве параметра zinfo_or_arcname используется метод сжатия, указанный в члене compress_type данного экземпляра ZipInfo. По умолчанию конструктор ZipInfo устанавливает этот член в значение ZIP_STORED.

Изменено в версии 3.2: Аргумент compress_type.

Изменено в версии 3.6: Вызов writestr() на ZipFile, созданном с режимом 'r', или на закрытом ZipFile приведет к появлению сообщения ValueError. Ранее вызывалась ошибка RuntimeError.

ZipFile.mkdir(zinfo_or_directory, mode=511)

Создать каталог внутри архива. Если zinfo_or_directory - строка, то внутри архива создается каталог с режимом, указанным в аргументе mode. Если же zinfo_or_directory является экземпляром ZipInfo, то аргумент mode игнорируется.

Архив должен быть открыт в режиме 'w', 'x' или 'a'.

Added in version 3.11.

Также доступны следующие атрибуты данных:

ZipFile.filename

Имя файла ZIP.

ZipFile.debug

Уровень используемого отладочного вывода. Этот параметр может быть установлен в диапазоне от 0 (по умолчанию, без вывода) до 3 (максимальный вывод). Отладочная информация записывается в sys.stdout.

ZipFile.comment

Комментарий, связанный с ZIP-файлом как с объектом bytes. Если комментарий присваивается экземпляру ZipFile, созданному в режиме 'w', 'x' или 'a', его длина не должна превышать 65535 байт. Комментарии длиннее этого значения будут усечены.

Объекты пути

class zipfile.Path(root, at='')

Создайте объект Path из root zip-файла (который может быть экземпляром ZipFile или file, подходящим для передачи конструктору ZipFile).

at указывает местоположение этого пути в zip-файле, например, „dir/file.txt“, „dir/“ или „“. По умолчанию - пустая строка, указывающая на корень.

Объекты Path раскрывают следующие возможности объектов pathlib.Path:

Объекты пути обходятся с помощью оператора / или joinpath.

Path.name

Последний компонент пути.

Path.open(mode='r', *, pwd, **)

Вызывает ZipFile.open() по текущему пути. Позволяет открывать путь для чтения или записи, в текстовом или двоичном виде с помощью поддерживаемых режимов: „r“, „w“, „rb“, „wb“. Позиционные и ключевые аргументы передаются в io.TextIOWrapper при открытии как текст и игнорируются в противном случае. pwd является параметром pwd для ZipFile.open().

Изменено в версии 3.9: Добавлена поддержка текстового и бинарного режимов для открытия. Режим по умолчанию теперь текстовый.

Изменено в версии 3.11.2: Параметр encoding может быть предоставлен в качестве позиционного аргумента, не вызывая TypeError. Как это было в версии 3.9. Код, который должен быть совместим с непропатченными версиями 3.10 и 3.11, должен передавать все аргументы io.TextIOWrapper, включая encoding, как ключевые слова.

Path.iterdir()

Перечислить дочерние каталоги текущего каталога.

Path.is_dir()

Возвращает True, если текущий контекст ссылается на каталог.

Path.is_file()

Возвращает True, если текущий контекст ссылается на файл.

Path.exists()

Возвращает True, если текущий контекст ссылается на файл или каталог в zip-файле.

Path.suffix

Последняя часть конечного компонента, разделенная точками, если таковая имеется. Обычно это называется расширением файла.

Added in version 3.11: Добавлено свойство Path.suffix.

Path.stem

Последний компонент пути без суффикса.

Added in version 3.11: Добавлено свойство Path.stem.

Path.suffixes

Список суффиксов пути, обычно называемых расширениями файлов.

Added in version 3.11: Добавлено свойство Path.suffixes.

Path.read_text(*, **)

Чтение текущего файла как юникодного текста. Позиционные и ключевые аргументы передаются по адресу io.TextIOWrapper (кроме buffer, который подразумевается контекстом).

Изменено в версии 3.11.2: Параметр encoding может быть предоставлен в качестве позиционного аргумента, не вызывая TypeError. Как это было в версии 3.9. Код, который должен быть совместим с непропатченными версиями 3.10 и 3.11, должен передавать все аргументы io.TextIOWrapper, включая encoding, как ключевые слова.

Path.read_bytes()

Считывание текущего файла в виде байтов.

Path.joinpath(*other)

Возвращает новый объект Path с каждым из других аргументов. Следующие аргументы эквивалентны:

>>> Path(...).joinpath('child').joinpath('grandchild')
>>> Path(...).joinpath('child', 'grandchild')
>>> Path(...) / 'child' / 'grandchild'

Изменено в версии 3.10: До версии 3.10 функция joinpath была недокументированной и принимала ровно один параметр.

Проект zipp предоставляет бэкпорты новейшей функциональности объектов пути для старых версий Python. Используйте zipp.Path вместо zipfile.Path для раннего доступа к изменениям.

Объекты PyZipFile

Конструктор PyZipFile принимает те же параметры, что и конструктор ZipFile, и один дополнительный параметр, optimize.

class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)

Изменено в версии 3.2: Добавлен параметр оптимизировать.

Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.

Экземпляры имеют один метод в дополнение к методам объектов ZipFile:

writepy(pathname, basename='', filterfunc=None)

Найдите файлы *.py и добавьте соответствующий файл в архив.

Если параметр optimize в PyZipFile не задан или задан -1, то соответствующий файл будет *.pyc, при необходимости компилируемым.

Если параметр optimize в PyZipFile был 0, 1 или 2, то в архив добавляются только файлы с этим уровнем оптимизации (см. compile()), при необходимости компилируясь.

Если pathname - это файл, то имя файла должно заканчиваться на .py, и на верхнем уровне добавляется только файл (соответствующий *.pyc) (без информации о пути). Если pathname - это файл, имя которого не заканчивается на .py, будет вызвана ошибка RuntimeError. Если это каталог, и каталог не является каталогом пакета, то все файлы *.pyc добавляются на верхнем уровне. Если каталог является каталогом пакета, то все *.pyc добавляются под именем пакета как путь к файлу, а если все подкаталоги являются каталогами пакета, то все они добавляются рекурсивно в отсортированном порядке.

basename предназначено только для внутреннего использования.

filterfunc, если задан, должен быть функцией, принимающей единственный строковый аргумент. Ей будет передан каждый путь (включая каждый отдельный полный путь к файлу) перед его добавлением в архив. Если filterfunc возвращает значение false, то путь не будет добавлен, а если это каталог, то его содержимое будет проигнорировано. Например, если все наши тестовые файлы находятся в каталогах test или начинаются со строки test_, мы можем использовать filterfunc, чтобы исключить их:

>>> zf = PyZipFile('myprog.zip')
>>> def notests(s):
...     fn = os.path.basename(s)
...     return (not (fn == 'test' or fn.startswith('test_')))
...
>>> zf.writepy('myprog', filterfunc=notests)

Метод writepy() создает архивы с такими именами файлов:

string.pyc                   # Top level name
test/__init__.pyc            # Package directory
test/testall.pyc             # Module test.testall
test/bogus/__init__.pyc      # Subpackage directory
test/bogus/myfile.pyc        # Submodule test.bogus.myfile

Изменено в версии 3.4: Добавлен параметр filterfunc.

Изменено в версии 3.6.2: Параметр pathname принимает значение path-like object.

Изменено в версии 3.7: Рекурсия сортирует записи каталога.

Объекты ZipInfo

Экземпляры класса ZipInfo возвращаются методами getinfo() и infolist() объектов ZipFile. Каждый объект хранит информацию об одном члене архива ZIP.

Существует один метод создания экземпляра ZipInfo для файла файловой системы:

classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)

Создайте экземпляр ZipInfo для файла в файловой системе, чтобы добавить его в zip-файл.

filename должно быть путем к файлу или каталогу в файловой системе.

Если указано arcname, оно используется в качестве имени архива. Если arcname не указано, то имя будет таким же, как filename, но с удаленными буквами дисков и ведущими разделителями путей.

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

Added in version 3.6.

Изменено в версии 3.6.2: Параметр filename принимает значение path-like object.

Изменено в версии 3.8: Добавлен параметр strict_timestamps, предназначенный только для ключевых слов.

Экземпляры имеют следующие методы и атрибуты:

ZipInfo.is_dir()

Возвращает True, если данный член архива является каталогом.

При этом используется имя записи: каталоги всегда должны заканчиваться на /.

Added in version 3.6.

ZipInfo.filename

Имя файла в архиве.

ZipInfo.date_time

Время и дата последней модификации члена архива. Это кортеж из шести значений:

Индекс

Значение

0

Год (>= 1980)

1

Месяц (на основе одного)

2

День месяца (на основе одного)

3

Часы (на основе нуля)

4

Минуты (на основе нуля)

5

Секунды (на основе нуля)

Примечание

Формат файлов ZIP не поддерживает временные метки до 1980 года.

ZipInfo.compress_type

Тип сжатия для члена архива.

ZipInfo.comment

Комментарий для отдельного члена архива в виде объекта bytes.

ZipInfo.extra

Данные поля расширения. В PKZIP Application Note содержатся некоторые комментарии по внутренней структуре данных, содержащихся в этом объекте bytes.

ZipInfo.create_system

Система, создавшая архив ZIP.

ZipInfo.create_version

Версия PKZIP, создающая ZIP-архив.

ZipInfo.extract_version

Версия PKZIP, необходимая для извлечения архива.

ZipInfo.reserved

Должно быть равно нулю.

ZipInfo.flag_bits

Биты флага ZIP.

ZipInfo.volume

Номер тома заголовка файла.

ZipInfo.internal_attr

Внутренние атрибуты.

ZipInfo.external_attr

Атрибуты внешних файлов.

ZipInfo.header_offset

Байт смещения к заголовку файла.

ZipInfo.CRC

CRC-32 несжатого файла.

ZipInfo.compress_size

Размер сжатых данных.

ZipInfo.file_size

Размер несжатого файла.

Интерфейс командной строки

Модуль zipfile предоставляет простой интерфейс командной строки для работы с архивами ZIP.

Если вы хотите создать новый ZIP-архив, укажите его имя после опции -c, а затем перечислите имена файлов, которые должны быть включены:

$ python -m zipfile -c monty.zip spam.txt eggs.txt

Передача каталога также допустима:

$ python -m zipfile -c monty.zip life-of-brian_1979/

Если вы хотите распаковать ZIP-архив в указанную директорию, используйте опцию -e:

$ python -m zipfile -e monty.zip target-dir/

Чтобы получить список файлов в ZIP-архиве, используйте параметр -l:

$ python -m zipfile -l monty.zip

Параметры командной строки

-l <zipfile>
--list <zipfile>

Список файлов в zip-файле.

-c <zipfile> <source1> ... <sourceN>
--create <zipfile> <source1> ... <sourceN>

Создайте zip-файл из исходных файлов.

-e <zipfile> <output_dir>
--extract <zipfile> <output_dir>

Распакуйте zip-файл в целевой каталог.

-t <zipfile>
--test <zipfile>

Проверьте, является ли zip-файл действительным или нет.

--metadata-encoding <encoding>

Укажите кодировку имен членов для -l, -e и -t.

Added in version 3.11.

Подводные камни декомпрессии

Извлечение в модуле zipfile может закончиться неудачей из-за некоторых подводных камней, перечисленных ниже.

Из самого файла

Распаковка может завершиться неудачей из-за неправильного пароля / контрольной суммы CRC / формата ZIP или неподдерживаемого метода сжатия / расшифровки.

Ограничения файловой системы

Превышение ограничений различных файловых систем может привести к сбою распаковки. Например, допустимые символы в записях каталогов, длина имени файла, длина имени пути, размер одного файла, количество файлов и т. д.

Ограничения ресурсов

Недостаток памяти или объема диска приводит к тому, что декомпрессия не удается. Например, бомбы распаковки (они же ZIP bomb) применяются к библиотеке zip-файлов, что может привести к исчерпанию дискового объема.

Прерывание

Прерывание процесса распаковки, например, нажатие клавиши control-C или завершение процесса распаковки, может привести к неполной распаковке архива.

Поведение по умолчанию при извлечении

Незнание стандартного поведения при извлечении может привести к неожиданным результатам распаковки. Например, при извлечении одного и того же архива дважды он перезаписывает файлы без запроса.