Документация Python неофициальный перевод
Содержание страницы

zipfile – Работа с ZIP-архивамиzipfile – Work with ZIP archives

Исходный код: Lib/zipfile/


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

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

Для работы со сжатыми архивами требуются дополнительные модули, такие как zlib, bz2, lzma и compression.zstd. Если в вашей сборке CPython каких-то из них нет, обратитесь к документации вашего дистрибьютора (то есть того, кто предоставил вам Python). Если вы сами дистрибьютор, смотрите раздел Требования к дополнительным модулям.

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

exception zipfile.BadZipFile

Исключение, возникающее при повреждённых ZIP-файлах.

Добавлено в версии 3.2.

exception zipfile.BadZipfile

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

Устарело с версии 3.2.

exception zipfile.LargeZipFile

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

class zipfile.ZipFile

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

class zipfile.Path

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

Добавлено в версии 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 objects.

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

_for_archive(archive)

Приводит date_time, атрибуты сжатия и внешние атрибуты к подходящим значениям по умолчанию, используемым ZipFile.writestr().

Возвращает self для цепочечного вызова.

Добавлено в версии 3.14.

zipfile.is_zipfile(filename)

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

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

zipfile.ZIP_STORED

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

zipfile.ZIP_DEFLATED

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

zipfile.ZIP_BZIP2

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

Добавлено в версии 3.3.

zipfile.ZIP_LZMA

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

Добавлено в версии 3.3.

zipfile.ZIP_ZSTANDARD

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

Примечание

В APPNOTE 6.3.7 методу сжатия Zstandard был присвоен идентификатор метода 20. В APPNOTE 6.3.8 он был изменён на 93 во избежание конфликтов, а идентификатор 20 устарел. Для обеспечения совместимости модуль zipfile читает оба идентификатора, но записывает данные только с идентификатором 93.

Добавлено в версии 3.14.

Примечание

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

См. также

Примечание по применению PKZIP

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

Домашняя страница Info-ZIP

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

Объекты ZipFileZipFile objects

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

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

Параметр 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 или ZIP_ZSTANDARD; нераспознанные значения приведут к возбуждению NotImplementedError. Если указаны ZIP_DEFLATED, ZIP_BZIP2, ZIP_LZMA или ZIP_ZSTANDARD, но соответствующий модуль (zlib, bz2, lzma или compression.zstd) недоступен, возбуждается 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). При использовании ZIP_ZSTANDARD обычно принимаются целые числа от -131072 до 22 (см. CompressionParameter.compression_level для получения информации о допустимых значениях и их значении).

Аргумент 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 принимает объект, подобный пути.

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

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

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

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())

При mode '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 для чтения сжатых текстовых файлов в режиме универсальные символы новой строки.

Изменено в версии 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.

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

Примечание

Если имя файла элемента является абсолютным путём, диск/UNC-точка и начальные (обратные) слеши будут удалены, например: ///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 принимает объект, подобный пути.

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 принимает объект, подобный пути.

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 или ZIP_ZSTANDARD, приведёт к исключению 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.

Изменено в версии 3.14: Теперь учитывается переменная окружения SOURCE_DATE_EPOCH. Если она установлена, используется это значение как временная метка изменения для файла, записываемого в ZIP-архив, вместо текущего времени.

ZipFile.mkdir(zinfo_or_directory, mode=511)

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

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

Добавлено в версии 3.12.

ZipFile.remove(zinfo_or_arcname)

Удаляет запись элемента из центрального каталога архива. zinfo_or_arcname может быть полным путём к элементу или экземпляром ZipInfo. Если несколько элементов имеют один и тот же полный путь и путь задан строкой, будет удалён только один из них, причём какой именно – не определено; полагаться на это не следует. Передайте конкретный экземпляр ZipInfo для удаления определённого элемента.

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

Возвращает удалённый экземпляр ZipInfo.

Вызов remove() на закрытом ZipFile вызовет исключение ValueError.

Примечание

Этот метод удаляет только запись элемента из центрального каталога, делая её недоступной для большинства инструментов. Локальная запись файла элемента, включая содержимое и метаданные, остаётся в архиве и всё ещё может быть восстановлена с помощью криминалистических средств. После этого вызовите repack(), чтобы удалить локальную запись файла и освободить место; передайте возвращённый экземпляр ZipInfo в repack(), чтобы данные были гарантированно удалены независимо от того, как была записана запись.

Добавлено в версии 3.16.0a0 (не выпущено).

ZipFile.repack(removed=None, *, strict_descriptor=True[, chunk_size])

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

Если передан removed, это должна быть последовательность объектов ZipInfo, представляющих недавно удалённые элементы; будут удалены только соответствующие им локальные записи файлов. В противном случае архив сканируется для поиска и удаления локальных записей файлов, на которые больше нет ссылок в центральном каталоге.

Передача removed – самый надёжный способ освободить место: соответствующие локальные записи файлов находятся непосредственно в центральном каталоге и удаляются независимо от того, как они были записаны, тогда как сканирование, используемое при отсутствии removed, может оставить некоторые записи на месте (см. strict_descriptor ниже). Чтобы удалить элементы и освободить их место за один шаг:

with ZipFile('spam.zip', 'a') as myzip:
    removed = [myzip.remove(name) for name in ('ham.txt', 'eggs.txt')]
    myzip.repack(removed)

При сканировании strict_descriptor управляет обработкой записей, записанных с неподписанным дескриптором данных. Дескриптор данных – это необязательная запись, содержащая CRC и размеры записи; она хранится сразу после данных записи. Она используется, когда архив записывается в непозиционируемый поток, и является подписанным, если начинается с сигнатуры-маркера, или неподписанным в противном случае. Неподписанные дескрипторы объявлены устаревшими в PKZIP Application Note начиная с версии 6.3.0 (выпущенной в 2006 году) и записываются только некоторыми устаревшими утилитами; подписанные дескрипторы (записываемые Python и другими современными инструментами) всегда обнаруживаются. Когда strict_descriptor равен true (по умолчанию), обнаруживаются только подписанные дескрипторы данных, поэтому запись без ссылки, записанная с неподписанным дескриптором, не обнаруживается, и её место не освобождается при сканировании. Установка strict_descriptor=False дополнительно обнаруживает неподписанные дескрипторы, ценой значительного замедления сканирования – в худшем случае в 100–1000 раз, что может использоваться как вектор отказа в обслуживании для ненадёжных входных данных. Это не влияет на записи без дескриптора данных и не требуется, если указан removed.

chunk_size может указываться для управления размером буфера при перемещении данных записи (по умолчанию 1 МиБ).

Вызов repack() на закрытом ZipFile вызовет исключение ValueError.

Примечание

Алгоритм сканирования основан на эвристике и предполагает, что ZIP-файл имеет нормальную структуру, например, записи локальных файлов хранятся последовательно, без перекрытия или перемежающихся двоичных данных. Предшествующие двоичные данные, такие как заглушка самораспаковывающегося архива, распознаются и сохраняются, если только они случайно не содержат байты, которые по нескольким параметрам совпадают с корректной записью локального файла – крайне редкий случай. Встроенные ZIP-нагрузки также обрабатываются корректно, если они следуют нормальной структуре. Однако алгоритм не гарантирует корректность или безопасность для ненадёжных или специально сформированных входных данных. Обычно рекомендуется указывать аргумент removed для повышения надёжности и производительности.

Добавлено в версии 3.16.0a0 (не выпущено).

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

ZipFile.filename

Имя ZIP-файла.

ZipFile.debug

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

ZipFile.comment

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

Объекты PathPath objects

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

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

at задаёт расположение этого Path внутри zip-файла, например, ‘dir/file.txt’, ‘dir/’ или ‘’. По умолчанию – пустая строка, что означает корень.

Примечание

Класс Path не проверяет имена файлов внутри ZIP-архива. В отличие от методов ZipFile.extract() и ZipFile.extractall(), вызывающий код обязан валидировать или очищать имена файлов для предотвращения уязвимостей обхода пути (например, абсолютные пути или пути с компонентами «..»). При работе с ненадёжными архивами рекомендуется разрешать имена файлов с помощью os.path.abspath() и проверять их относительно целевого каталога с помощью os.path.commonpath().

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

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

Path.name

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

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

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

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

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

Path.iterdir()

Перечисляет дочерние элементы текущего каталога.

Path.is_dir()

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

Path.is_file()

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

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

Добавлено в версии 3.12.

Изменено в версии 3.13: Ранее is_symlink безусловно возвращал False.

Path.exists()

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

Path.suffix

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

Добавлено в версии 3.11: Добавлено свойство Path.suffix.

Path.stem

Конечный компонент пути без его суффикса.

Добавлено в версии 3.11: Добавлено свойство Path.stem.

Path.suffixes

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

Добавлено в версии 3.11: Добавлено свойство Path.suffixes.

Path.read_text(*, **)

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

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

Path.read_bytes()

Читает текущий файл как байты.

Path.joinpath(*other)

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

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

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

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

Объекты PyZipFilePyZipFile objects

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

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

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

Изменено в версии 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 возвращает ложное значение, путь не будет добавлен, а если это каталог, его содержимое будет проигнорировано. Например, если все наши тестовые файлы находятся в каталогах 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                   # Имя верхнего уровня
test/__init__.pyc            # Каталог пакета
test/testall.pyc             # Модуль test.testall
test/bogus/__init__.pyc      # Каталог подпакета
test/bogus/myfile.pyc        # Подмодуль test.bogus.myfile

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

Изменено в версии 3.6.2: Параметр pathname теперь принимает объект, подобный пути.

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

Объекты ZipInfoZipInfo objects

Экземпляры класса 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: временная метка также устанавливается на предельное значение.

Добавлено в версии 3.6.

Изменено в версии 3.6.2: Параметр filename теперь принимает объект, подобный пути.

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

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

ZipInfo.is_dir()

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

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

Добавлено в версии 3.6.

ZipInfo.filename

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

ZipInfo.date_time

Время и дата последнего изменения элемента архива. Это кортеж из шести значений, представляющих поля «время последнего изменения файла» и «дата последнего изменения файла» из центрального каталога ZIP-файла.

Кортеж содержит:

Индекс

Значение

0

Год (>= 1980)

1

Месяц (начиная с 1)

2

День месяца (начиная с 1)

3

Часы (начиная с 0)

4

Минуты (начиная с 0)

5

Секунды (начиная с 0)

Примечание

Формат ZIP поддерживает несколько полей временных меток в разных местах (центральный каталог, дополнительные поля для систем NTFS/UNIX и т.д.). Данный атрибут возвращает метку времени именно из центрального каталога. Формат временной метки центрального каталога в ZIP-файлах не поддерживает метки до 1980 года. Хотя некоторые форматы дополнительных полей (например, метки UNIX) могут представлять более ранние даты, этот атрибут возвращает только метку из центрального каталога.

Временная метка центрального каталога интерпретируется как местное время, а не UTC, чтобы соответствовать поведению других zip-инструментов.

ZipInfo.compress_type

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

ZipInfo.comment

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

ZipInfo.extra

Данные поля расширения. Примечание к приложению PKZIP содержит некоторые комментарии о внутренней структуре данных, содержащихся в этом объекте 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

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

Интерфейс командной строкиCommand-line interface

Модуль 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

Параметры командной строкиCommand-line options

-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.

Добавлено в версии 3.12.

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

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

Проблемы, связанные с файломFrom file itself

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

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

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

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

Нехватка памяти или дискового пространства может привести к сбою распаковки. Например, бомбы распаковки (также известные как ZIP-бомбы) применимы к библиотеке zipfile и могут вызвать исчерпание дискового пространства.

ПрерываниеInterruption

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

Действия по умолчанию при извлеченииDefault behaviors of extraction

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