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

zipfile.md

707 строк · 68.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.16/library/zipfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `zipfile` – Работа с ZIP-архивами89**Исходный код:** [Lib/zipfile/](https://python-all.ru/src/main/Lib/zipfile)1011---1213Формат ZIP – распространённый стандарт архивации и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и просмотра содержимого ZIP-файлов. Любое продвинутое использование модуля требует понимания формата, описанного в [PKZIP Application Note](https://python-all.ru/3.16/library/zipfile.html).1415Этот модуль не поддерживает многотомные ZIP-файлы. Он может обрабатывать ZIP-файлы, использующие расширения ZIP64 (то есть ZIP-файлы размером более 4 ГиБ). Модуль поддерживает расшифровку зашифрованных файлов в ZIP-архивах, но не может создавать зашифрованные файлы. Расшифровка выполняется очень медленно, так как реализована на чистом Python, а не на C.1617Для работы со сжатыми архивами требуются [дополнительные модули](https://python-all.ru/3.16/glossary.html#term-optional-module), такие как [`zlib`](https://python-all.ru/3.16/library/zlib.html#module-zlib), [`bz2`](https://python-all.ru/3.16/library/bz2.html#module-bz2), [`lzma`](https://python-all.ru/3.16/library/lzma.html#module-lzma) и [`compression.zstd`](https://python-all.ru/3.16/library/compression.zstd.html#module-compression.zstd). Если в вашей сборке CPython каких-то из них нет, обратитесь к документации вашего дистрибьютора (то есть того, кто предоставил вам Python). Если вы сами дистрибьютор, смотрите раздел [Требования к дополнительным модулям](https://python-all.ru/3.16/using/configure.html#optional-module-requirements).1819Модуль определяет следующие элементы:2021#### `exception zipfile.BadZipFile`2223Исключение, возникающее при повреждённых ZIP-файлах.2425Добавлено в версии 3.2.2627#### `exception zipfile.BadZipfile`2829Псевдоним [`BadZipFile`](https://python-all.ru/3.16/library/zipfile.html#zipfile.BadZipFile) для совместимости со старыми версиями Python.3031Устарело с версии 3.2.3233#### `exception zipfile.LargeZipFile`3435Исключение, возникающее, когда ZIP-файлу требуется функциональность ZIP64, но она не включена.3637#### `class zipfile.ZipFile`3839Класс для чтения и записи ZIP-файлов. Описание конструктора см. в разделе [ZipFile objects](https://python-all.ru/3.16/library/zipfile.html#zipfile-objects).4041#### `class zipfile.Path`4243Класс, реализующий подмножество интерфейса, предоставляемого [`pathlib.Path`](https://python-all.ru/3.16/library/pathlib.html#pathlib.Path), включая полный интерфейс [`importlib.resources.abc.Traversable`](https://python-all.ru/3.16/library/importlib.resources.abc.html#importlib.resources.abc.Traversable).4445Добавлено в версии 3.8.4647#### `class zipfile.PyZipFile`4849Класс для создания ZIP-архивов, содержащих библиотеки Python.5051#### `class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))`5253Класс для представления информации об элементе архива. Экземпляры этого класса возвращаются методами [`getinfo()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.getinfo) и [`infolist()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.infolist) объектов [`ZipFile`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile). Большинству пользователей модуля `zipfile` не нужно создавать такие экземпляры; достаточно использовать те, что создаются этим модулем. *filename* должен содержать полное имя элемента архива, а *date\_time* – кортеж из шести полей, описывающих время последнего изменения файла. Поля описаны в разделе [ZipInfo objects](https://python-all.ru/3.16/library/zipfile.html#zipinfo-objects).5455Изменено в версии 3.13: Добавлен публичный атрибут `compress_level`, который открывает доступ к ранее защищённому `_compresslevel`. Старое защищённое имя продолжает работать как свойство для обратной совместимости.5657#### `_for_archive(archive)`5859Приводит date\_time, атрибуты сжатия и внешние атрибуты к подходящим значениям по умолчанию, используемым [`ZipFile.writestr()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.writestr).6061Возвращает self для цепочечного вызова.6263Добавлено в версии 3.14.6465#### `zipfile.is_zipfile(filename)`6667Возвращает `True`, если *filename* является корректным ZIP-файлом (проверка по магическому числу), иначе возвращает `False`. *filename* может быть файлом или файлоподобным объектом.6869Изменено в версии 3.1: Добавлена поддержка файлов и файлоподобных объектов.7071#### `zipfile.ZIP_STORED`7273Числовая константа для несжатого элемента архива.7475#### `zipfile.ZIP_DEFLATED`7677Числовая константа для стандартного метода сжатия ZIP. Требует модуль [`zlib`](https://python-all.ru/3.16/library/zlib.html#module-zlib).7879#### `zipfile.ZIP_BZIP2`8081Числовая константа для метода сжатия BZIP2. Для этого требуется модуль [`bz2`](https://python-all.ru/3.16/library/bz2.html#module-bz2).8283Добавлено в версии 3.3.8485#### `zipfile.ZIP_LZMA`8687Числовая константа для метода сжатия LZMA. Для этого требуется модуль [`lzma`](https://python-all.ru/3.16/library/lzma.html#module-lzma).8889Добавлено в версии 3.3.9091#### `zipfile.ZIP_ZSTANDARD`9293Числовая константа для сжатия Zstandard. Для этого требуется модуль [`compression.zstd`](https://python-all.ru/3.16/library/compression.zstd.html#module-compression.zstd).9495> **Примечание**96>97> В APPNOTE 6.3.7 методу сжатия Zstandard был присвоен идентификатор метода `20`. В APPNOTE 6.3.8 он был изменён на `93` во избежание конфликтов, а идентификатор `20` устарел. Для обеспечения совместимости модуль `zipfile` читает оба идентификатора, но записывает данные только с идентификатором `93`.9899Добавлено в версии 3.14.100101> **Примечание**102>103> Спецификация формата ZIP включает поддержку сжатия bzip2 с 2001 года, сжатия LZMA с 2006 года и сжатия Zstandard с 2020 года. Однако некоторые инструменты (включая старые версии Python) не поддерживают эти методы сжатия и могут либо полностью отказаться обрабатывать ZIP-файл, либо не извлекать отдельные файлы.104105> **См. также**106>107> **[Примечание по применению PKZIP](https://python-all.ru/3.16/library/zipfile.html)**108>109> Документация по формату ZIP-файлов от Фила Каца, создателя формата и используемых алгоритмов.110>111> **[Домашняя страница Info-ZIP](https://python-all.ru/3.16/library/zipfile.html)**112>113> Информация о программах для работы с ZIP-архивами и библиотеках для разработки проекта Info-ZIP.114115## Объекты ZipFile116117#### `class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)`118119Открывает ZIP-файл, где *file* может быть путём к файлу (строка), файлоподобным объектом или [объектом, подобным пути](https://python-all.ru/3.16/glossary.html#term-path-like-object).120121Параметр *mode* должен быть `'r'` для чтения существующего файла, `'w'` для усечения и записи нового файла, `'a'` для добавления к существующему файлу или `'x'` для исключительного создания и записи нового файла. Если *mode* равен `'x'` и *file* указывает на существующий файл, будет вызвано исключение [`FileExistsError`](https://python-all.ru/3.16/library/exceptions.html#FileExistsError). Если *mode* равен `'a'` и *file* указывает на существующий ZIP-файл, в него добавляются дополнительные файлы. Если *file* не указывает на ZIP-файл, то в конец файла добавляется новый ZIP-архив. Это предназначено для добавления ZIP-архива в другой файл (например, `python.exe`). Если *mode* равен `'a'` и файл вообще не существует, он создаётся. Если *mode* равен `'r'` или `'a'`, файл должен поддерживать позиционирование.122123*compression* – это метод сжатия ZIP, используемый при записи архива; он должен быть [`ZIP_STORED`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_STORED), [`ZIP_DEFLATED`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_DEFLATED), [`ZIP_BZIP2`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_BZIP2), [`ZIP_LZMA`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_LZMA) или [`ZIP_ZSTANDARD`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_ZSTANDARD); нераспознанные значения приведут к возбуждению [`NotImplementedError`](https://python-all.ru/3.16/library/exceptions.html#NotImplementedError). Если указаны `ZIP_DEFLATED`, `ZIP_BZIP2`, `ZIP_LZMA` или `ZIP_ZSTANDARD`, но соответствующий модуль ([`zlib`](https://python-all.ru/3.16/library/zlib.html#module-zlib), [`bz2`](https://python-all.ru/3.16/library/bz2.html#module-bz2), [`lzma`](https://python-all.ru/3.16/library/lzma.html#module-lzma) или [`compression.zstd`](https://python-all.ru/3.16/library/compression.zstd.html#module-compression.zstd)) недоступен, возбуждается [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError). По умолчанию используется `ZIP_STORED`.124125Если *allowZip64* равен `True` (по умолчанию), zipfile будет создавать ZIP-файлы с расширениями ZIP64, когда размер zip-файла превышает 4 ГиБ. Если он равен `false`, `zipfile` возбудит исключение, когда ZIP-файлу потребуются расширения ZIP64.126127Параметр *compresslevel* управляет уровнем сжатия при записи файлов в архив. При использовании [`ZIP_STORED`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_STORED) или [`ZIP_LZMA`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_LZMA) он не действует. При использовании [`ZIP_DEFLATED`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_DEFLATED) принимаются целые числа от `0` до `9` (см. [`zlib`](https://python-all.ru/3.16/library/zlib.html#zlib.compressobj)). При использовании [`ZIP_BZIP2`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_BZIP2) принимаются целые числа от `1` до `9` (см. [`bz2`](https://python-all.ru/3.16/library/bz2.html#bz2.BZ2File)). При использовании [`ZIP_ZSTANDARD`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_ZSTANDARD) обычно принимаются целые числа от `-131072` до `22` (см. [`CompressionParameter.compression_level`](https://python-all.ru/3.16/library/compression.zstd.html#compression.zstd.CompressionParameter.compression_level) для получения информации о допустимых значениях и их значении).128129Аргумент *strict\_timestamps* при значении `False` позволяет архивировать файлы старше 1980-01-01, ценой установки временной метки на 1980-01-01. Аналогичное поведение для файлов новее 2107-12-31: временная метка также устанавливается на предельное значение.130131Если режим равен `'r'`, *metadata\_encoding* можно задать как имя кодека, который будет использоваться для декодирования метаданных, таких как имена элементов и ZIP-комментарии.132133Если файл создан с режимом `'w'`, `'x'` или `'a'`, а затем [`closed`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.close) без добавления каких-либо файлов в архив, в файл будут записаны соответствующие структуры ZIP для пустого архива.134135ZipFile также является контекстным менеджером и поэтому поддерживает оператор [`with`](https://python-all.ru/3.16/reference/compound_stmts.html#with). В примере *myzip* закрывается после завершения блока оператора `with` – даже если возникло исключение:136137```python138with ZipFile('spam.zip', 'w') as myzip:139    myzip.write('eggs.txt')140```141142> **Примечание**143>144> *metadata\_encoding* – это общеэкземплярная настройка для ZipFile. Невозможно задать её для отдельного элемента.145>146> Этот атрибут – обходной путь для устаревших реализаций, которые создают архивы с именами в кодировке текущей локали или кодовой странице (в основном в Windows). Согласно стандарту .ZIP, кодировка метаданных может быть указана как IBM code page (по умолчанию) или UTF-8 с помощью флага в заголовке архива. Этот флаг имеет приоритет над *metadata\_encoding*, который является расширением, специфичным для Python.147148Изменено в версии 3.2: Добавлена возможность использования `ZipFile` в качестве контекстного менеджера.149150Изменено в версии 3.3: Добавлена поддержка сжатия [`bzip2`](https://python-all.ru/3.16/library/bz2.html#module-bz2) и [`lzma`](https://python-all.ru/3.16/library/lzma.html#module-lzma).151152Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.153154Изменено в версии 3.5: Добавлена поддержка записи в непозиционируемые потоки. Добавлена поддержка режима `'x'`.155156Изменено в версии 3.6: Ранее для нераспознанных значений сжатия возбуждалось простое исключение [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError).157158Изменено в версии 3.6.2: Параметр *file* принимает [объект, подобный пути](https://python-all.ru/3.16/glossary.html#term-path-like-object).159160Изменено в версии 3.7: Добавлен параметр *compresslevel*.161162Изменено в версии 3.8: Параметр *strict\_timestamps*, передаваемый только по ключу.163164Изменено в версии 3.11: Добавлена поддержка указания кодировки имени элемента для чтения метаданных в заголовках каталога и файлов zipfile.165166#### `ZipFile.close()`167168Закрывает файл архива. Перед выходом из программы необходимо вызвать `close()`, иначе важные записи не будут записаны.169170#### `ZipFile.getinfo(name)`171172Возвращает объект [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo) с информацией об элементе архива *name*. Вызов `getinfo()` для имени, отсутствующего в архиве, приведёт к возникновению исключения [`KeyError`](https://python-all.ru/3.16/library/exceptions.html#KeyError).173174#### `ZipFile.infolist()`175176Возвращает список, содержащий объект [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo) для каждого элемента архива. Объекты расположены в том же порядке, что и их записи в реальном ZIP-файле на диске, если был открыт существующий архив.177178#### `ZipFile.namelist()`179180Возвращает список элементов архива по именам.181182#### `ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)`183184Предоставляет доступ к элементу архива в виде двоичного файлоподобного объекта. *name* может быть именем файла внутри архива или объектом [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo). Параметр *mode*, если указан, должен быть равен `'r'` (по умолчанию) или `'w'`. *pwd* – это пароль для расшифровки зашифрованных ZIP-файлов в виде объекта [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes).185186`open()` также является контекстным менеджером и поэтому поддерживает оператор [`with`](https://python-all.ru/3.16/reference/compound_stmts.html#with):187188```python189with ZipFile('spam.zip') as myzip:190    with myzip.open('eggs.txt') as myfile:191        print(myfile.read())192```193194При *mode* `'r'` файлоподобный объект (`ZipExtFile`) доступен только для чтения и предоставляет следующие методы: [`read()`](https://python-all.ru/3.16/library/io.html#io.BufferedIOBase.read), [`readline()`](https://python-all.ru/3.16/library/io.html#io.IOBase.readline), [`readlines()`](https://python-all.ru/3.16/library/io.html#io.IOBase.readlines), [`seek()`](https://python-all.ru/3.16/library/io.html#io.IOBase.seek), [`tell()`](https://python-all.ru/3.16/library/io.html#io.IOBase.tell), [`__iter__()`](https://python-all.ru/3.16/library/stdtypes.html#container.__iter__), [`__next__()`](https://python-all.ru/3.16/library/stdtypes.html#iterator.__next__). Эти объекты могут работать независимо от ZipFile.195196При `mode='w'` возвращается дескриптор файла для записи, который поддерживает метод [`write()`](https://python-all.ru/3.16/library/io.html#io.BufferedIOBase.write). Пока дескриптор для записи открыт, попытка чтения или записи других файлов в ZIP-архиве приведёт к возникновению исключения [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).197198В обоих случаях файлоподобный объект также имеет атрибуты `name`, который эквивалентен имени файла внутри архива, и `mode`, который равен `'rb'` или `'wb'` в зависимости от режима ввода.199200При записи файла, если размер файла заранее неизвестен, но может превысить 2 ГБ, передайте `force_zip64=True`, чтобы формат заголовка мог поддерживать большие файлы. Если размер файла известен заранее, создайте объект [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo) с установленным [`file_size`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo.file_size) и используйте его в качестве параметра *name*.201202> **Примечание**203>204> Методы `open()`, [`read()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.read) и [`extract()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.extract) могут принимать имя файла или объект [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo). Это пригодится при попытке чтения ZIP-файла, содержащего элементы с повторяющимися именами.205206Изменено в версии 3.6: Удалена поддержка `mode='U'`. Используйте [`io.TextIOWrapper`](https://python-all.ru/3.16/library/io.html#io.TextIOWrapper) для чтения сжатых текстовых файлов в режиме [универсальные символы новой строки](https://python-all.ru/3.16/glossary.html#term-universal-newlines).207208Изменено в версии 3.6: Теперь `ZipFile.open()` можно использовать для записи файлов в архив с опцией `mode='w'`.209210Изменено в версии 3.6: Вызов `open()` для закрытого ZipFile приводит к исключению [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError).211212Изменено в версии 3.13: Добавлены атрибуты `name` и `mode` для записываемого файлоподобного объекта. Значение атрибута `mode` для читаемого файлоподобного объекта было изменено с `'r'` на `'rb'`.213214#### `ZipFile.extract(member, path=None, pwd=None)`215216Извлекает элемент из архива в текущий рабочий каталог; *member* должно быть полным именем или объектом [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo). Информация о файле извлекается максимально точно. *path* указывает другой каталог для извлечения. *member* может быть именем файла или объектом `ZipInfo`. *pwd* – пароль для зашифрованных файлов в виде объекта [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes).217218Возвращает нормализованный путь (каталог или новый файл).219220> **Примечание**221>222> Если имя файла элемента является абсолютным путём, диск/UNC-точка и начальные (обратные) слеши будут удалены, например: `///foo/bar` становится `foo/bar` на Unix, а `C:\foo\bar` становится `foo\bar` на Windows. Все компоненты `".."` в имени файла элемента будут удалены, например: `../../foo../../ba..r` становится `foo../ba..r`. На Windows недопустимые символы (`:`, `<`, `>`, `|`, `"`, `?` и `*`) заменяются подчёркиванием (`_`).223224Изменено в версии 3.6: Вызов `extract()` для закрытого ZipFile приводит к исключению [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError).225226Изменено в версии 3.6.2: Параметр *path* принимает [объект, подобный пути](https://python-all.ru/3.16/glossary.html#term-path-like-object).227228#### `ZipFile.extractall(path=None, members=None, pwd=None)`229230Извлекает все элементы из архива в текущий рабочий каталог. *path* указывает другой каталог для извлечения. *members* необязателен и должен быть подмножеством списка, возвращаемого [`namelist()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.namelist). *pwd* – пароль для зашифрованных файлов в виде объекта [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes).231232> **Предупреждение**233>234> Никогда не извлекайте архивы из ненадёжных источников без предварительной проверки. Возможно создание файлов за пределами *path*, например, элементов с абсолютными именами или именами, содержащими компоненты «..». Этот модуль пытается предотвратить это. См. примечание [`extract()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.extract).235236Изменено в версии 3.6: Вызов `extractall()` для закрытого ZipFile приводит к исключению [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError).237238Изменено в версии 3.6.2: Параметр *path* принимает [объект, подобный пути](https://python-all.ru/3.16/glossary.html#term-path-like-object).239240#### `ZipFile.printdir()`241242Выводит оглавление архива в `sys.stdout`.243244#### `ZipFile.setpassword(pwd)`245246Устанавливает *pwd* (объект [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes)) в качестве пароля по умолчанию для извлечения зашифрованных файлов.247248#### `ZipFile.read(name, pwd=None)`249250Возвращает байты файла *name* из архива. *name* – это имя файла в архиве или объект [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo). Архив должен быть открыт для чтения или добавления. *pwd* – пароль для зашифрованных файлов в виде объекта [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes), и если указан, переопределяет пароль по умолчанию, заданный с помощью [`setpassword()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.setpassword). Вызов `read()` для ZipFile, использующего метод сжатия, отличный от [`ZIP_STORED`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_STORED), [`ZIP_DEFLATED`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_DEFLATED), [`ZIP_BZIP2`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_BZIP2), [`ZIP_LZMA`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_LZMA) или [`ZIP_ZSTANDARD`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_ZSTANDARD), приведёт к исключению [`NotImplementedError`](https://python-all.ru/3.16/library/exceptions.html#NotImplementedError). Ошибка также возникнет, если соответствующий модуль сжатия недоступен.251252Изменено в версии 3.6: Вызов `read()` для закрытого ZipFile приводит к исключению [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError).253254#### `ZipFile.testzip()`255256Читает все файлы архива и проверяет их CRC и заголовки файлов. Возвращает имя первого повреждённого файла или `None`.257258Изменено в версии 3.6: Вызов `testzip()` для закрытого ZipFile приводит к исключению [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError).259260#### `ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)`261262Записывает файл с именем *filename* в архив, присваивая ему архивное имя *arcname* (по умолчанию оно совпадает с *filename*, но без буквы диска и с удалёнными начальными разделителями путей). Если указан, *compress\_type* переопределяет значение, переданное в параметре *compression* конструктору для новой записи. Аналогично, *compresslevel* переопределит конструктор, если указан. Архив должен быть открыт с режимом `'w'`, `'x'` или `'a'`.263264> **Примечание**265>266> Стандарт ZIP-файлов исторически не определял кодировку метаданных, но настоятельно рекомендовал CP437 (оригинальную кодировку IBM PC) для совместимости. Последние версии допускают использование только UTF-8. В этом модуле UTF-8 будет автоматически использоваться для записи имён элементов, если они содержат любые не-ASCII символы. Невозможно записать имена элементов в любой кодировке, кроме ASCII или UTF-8.267268> **Примечание**269>270> Архивные имена должны быть относительными по отношению к корню архива, то есть не должны начинаться с разделителя пути.271272> **Примечание**273>274> Если `arcname` (или `filename`, если `arcname` не указан) содержит нулевой байт, имя файла в архиве будет обрезано по этому байту.275276> **Примечание**277>278> Начальный слэш в имени файла может привести к невозможности открытия архива в некоторых ZIP-программах в системах Windows.279280Изменено в версии 3.6: Вызов `write()` для ZipFile, созданного с режимом `'r'`, или для закрытого ZipFile приведёт к исключению [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError).281282#### `ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)`283284Записывает файл в архив. Содержимое – это *data*, который может быть экземпляром [`str`](https://python-all.ru/3.16/library/stdtypes.html#str) или [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes); если это `str`, то он сначала кодируется в UTF-8. *zinfo\_or\_arcname* – это либо имя файла, которое он получит в архиве, либо экземпляр [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo). Если это экземпляр, должны быть указаны как минимум имя файла, дата и время. Если это имя, дата и время устанавливаются на текущие дату и время. Архив должен быть открыт с режимом `'w'`, `'x'` или `'a'`.285286Если указан, *compress\_type* переопределяет значение, переданное в параметре *compression* конструктору для новой записи, или значение в *zinfo\_or\_arcname* (если это экземпляр [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo)). Аналогично, *compresslevel* переопределит конструктор, если указан.287288> **Примечание**289>290> При передаче экземпляра [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo) в качестве параметра *zinfo\_or\_arcname* используемый метод сжатия будет тем, который указан в элементе *compress\_type* данного экземпляра `ZipInfo`. По умолчанию конструктор `ZipInfo` устанавливает этот элемент в [`ZIP_STORED`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZIP_STORED).291292Изменено в версии 3.2: Аргумент *compress\_type*.293294Изменено в версии 3.6: Вызов `writestr()` для ZipFile, созданного с режимом `'r'`, или для закрытого ZipFile приведёт к исключению [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError).295296Изменено в версии 3.14: Теперь учитывается переменная окружения `SOURCE_DATE_EPOCH`. Если она установлена, используется это значение как временная метка изменения для файла, записываемого в ZIP-архив, вместо текущего времени.297298#### `ZipFile.mkdir(zinfo_or_directory, mode=511)`299300Создаёт каталог внутри архива. Если *zinfo\_or\_directory* – строка, каталог создаётся внутри архива с режимом, указанным в аргументе *mode*. Однако если *zinfo\_or\_directory* является экземпляром [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo), то аргумент *mode* игнорируется.301302Архив должен быть открыт с режимом `'w'`, `'x'` или `'a'`.303304Добавлено в версии 3.12.305306#### `ZipFile.remove(zinfo_or_arcname)`307308Удаляет запись элемента из центрального каталога архива. *zinfo\_or\_arcname* может быть полным путём к элементу или экземпляром [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo). Если несколько элементов имеют один и тот же полный путь и путь задан строкой, будет удалён только один из них, причём какой именно – не определено; полагаться на это не следует. Передайте конкретный экземпляр `ZipInfo` для удаления определённого элемента.309310Архив должен быть открыт с режимом `'w'`, `'x'` или `'a'`.311312Возвращает удалённый экземпляр [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo).313314Вызов `remove()` на закрытом ZipFile вызовет исключение [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).315316> **Примечание**317>318> Этот метод удаляет только запись элемента из центрального каталога, делая её недоступной для большинства инструментов. Локальная запись файла элемента, включая содержимое и метаданные, остаётся в архиве и всё ещё может быть восстановлена с помощью криминалистических средств. После этого вызовите [`repack()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.repack), чтобы удалить локальную запись файла и освободить место; передайте возвращённый экземпляр [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo) в `repack()`, чтобы данные были гарантированно удалены независимо от того, как была записана запись.319320Добавлено в версии 3.16.0a0 (не выпущено).321322#### `ZipFile.repack(removed=None, *, strict_descriptor=True[, chunk_size])`323324Перезаписывает архив для удаления неиспользуемых локальных записей файлов, уменьшая его размер. Архив должен быть открыт в режиме `'a'`.325326Если передан *removed*, это должна быть последовательность объектов [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo), представляющих недавно удалённые элементы; будут удалены только соответствующие им локальные записи файлов. В противном случае архив сканируется для поиска и удаления локальных записей файлов, на которые больше нет ссылок в центральном каталоге.327328Передача *removed* – самый надёжный способ освободить место: соответствующие локальные записи файлов находятся непосредственно в центральном каталоге и удаляются независимо от того, как они были записаны, тогда как сканирование, используемое при отсутствии *removed*, может оставить некоторые записи на месте (см. *strict\_descriptor* ниже). Чтобы удалить элементы и освободить их место за один шаг:329330```python331with ZipFile('spam.zip', 'a') as myzip:332    removed = [myzip.remove(name) for name in ('ham.txt', 'eggs.txt')]333    myzip.repack(removed)334```335336При сканировании *strict\_descriptor* управляет обработкой записей, записанных с неподписанным *дескриптором данных*. Дескриптор данных – это необязательная запись, содержащая CRC и размеры записи; она хранится сразу после данных записи. Она используется, когда архив записывается в непозиционируемый поток, и является *подписанным*, если начинается с сигнатуры-маркера, или *неподписанным* в противном случае. Неподписанные дескрипторы объявлены устаревшими в [PKZIP Application Note](https://python-all.ru/3.16/library/zipfile.html) начиная с версии 6.3.0 (выпущенной в 2006 году) и записываются только некоторыми устаревшими утилитами; подписанные дескрипторы (записываемые Python и другими современными инструментами) всегда обнаруживаются. Когда *strict\_descriptor* равен true (по умолчанию), обнаруживаются только подписанные дескрипторы данных, поэтому запись без ссылки, записанная с неподписанным дескриптором, не обнаруживается, и её место не освобождается при сканировании. Установка `strict_descriptor=False` дополнительно обнаруживает неподписанные дескрипторы, ценой значительного замедления сканирования – в худшем случае в 100–1000 раз, что может использоваться как вектор отказа в обслуживании для ненадёжных входных данных. Это не влияет на записи без дескриптора данных и не требуется, если указан *removed*.337338*chunk\_size* может указываться для управления размером буфера при перемещении данных записи (по умолчанию 1 МиБ).339340Вызов `repack()` на закрытом ZipFile вызовет исключение [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).341342> **Примечание**343>344> Алгоритм сканирования основан на эвристике и предполагает, что ZIP-файл имеет нормальную структуру, например, записи локальных файлов хранятся последовательно, без перекрытия или перемежающихся двоичных данных. Предшествующие двоичные данные, такие как заглушка самораспаковывающегося архива, распознаются и сохраняются, если только они случайно не содержат байты, которые по нескольким параметрам совпадают с корректной записью локального файла – крайне редкий случай. Встроенные ZIP-нагрузки также обрабатываются корректно, если они следуют нормальной структуре. Однако алгоритм не гарантирует корректность или безопасность для ненадёжных или специально сформированных входных данных. Обычно рекомендуется указывать аргумент *removed* для повышения надёжности и производительности.345346Добавлено в версии 3.16.0a0 (не выпущено).347348Также доступны следующие атрибуты данных:349350#### `ZipFile.filename`351352Имя ZIP-файла.353354#### `ZipFile.debug`355356Уровень отладочного вывода. Может быть установлен от `0` (по умолчанию, без вывода) до `3` (максимальный вывод). Отладочная информация записывается в `sys.stdout`.357358#### `ZipFile.comment`359360Комментарий, связанный с ZIP-файлом, в виде объекта [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes). Если присваивать комментарий экземпляру [`ZipFile`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile), созданному с режимом `'w'`, `'x'` или `'a'`, его длина не должна превышать 65535 байт. Комментарии длиннее этого будут обрезаны.361362## Объекты Path363364#### `class zipfile.Path(root, at='')`365366Создаёт объект Path из zip-файла `root` (который может быть экземпляром [`ZipFile`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile) или `file`, подходящим для передачи в конструктор `ZipFile`).367368`at` задаёт расположение этого Path внутри zip-файла, например, ‘dir/file.txt’, ‘dir/’ или ‘’. По умолчанию – пустая строка, что означает корень.369370> **Примечание**371>372> Класс `Path` не проверяет имена файлов внутри ZIP-архива. В отличие от методов [`ZipFile.extract()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.extract) и [`ZipFile.extractall()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.extractall), вызывающий код обязан валидировать или очищать имена файлов для предотвращения уязвимостей обхода пути (например, абсолютные пути или пути с компонентами «..»). При работе с ненадёжными архивами рекомендуется разрешать имена файлов с помощью [`os.path.abspath()`](https://python-all.ru/3.16/library/os.path.html#os.path.abspath) и проверять их относительно целевого каталога с помощью [`os.path.commonpath()`](https://python-all.ru/3.16/library/os.path.html#os.path.commonpath).373374Объекты Path предоставляют следующие возможности объектов [`pathlib.Path`](https://python-all.ru/3.16/library/pathlib.html#pathlib.Path) :375376Объекты Path можно обходить с помощью оператора `/` или `joinpath`.377378#### `Path.name`379380Последний компонент пути.381382#### `Path.open(mode='r', *, pwd, **)`383384Вызывает [`ZipFile.open()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.open) для текущего пути. Позволяет открывать для чтения или записи, в текстовом или двоичном режиме через поддерживаемые режимы: ‘r’, ‘w’, ‘rb’, ‘wb’. Позиционные и именованные аргументы передаются в [`io.TextIOWrapper`](https://python-all.ru/3.16/library/io.html#io.TextIOWrapper) при открытии как текст и игнорируются в противном случае. `pwd` – это параметр `pwd` для `ZipFile.open()`.385386Изменено в версии 3.9: Добавлена поддержка текстового и двоичного режимов для open. Режим по умолчанию теперь текстовый.387388Изменено в версии 3.11.2: Параметр `encoding` теперь можно передавать как позиционный аргумент, не вызывая [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError). Как это было возможно в 3.9. Код, которому требуется совместимость с неисправленными версиями 3.10 и 3.11, должен передавать все аргументы [`io.TextIOWrapper`](https://python-all.ru/3.16/library/io.html#io.TextIOWrapper), включая `encoding`, только как именованные.389390#### `Path.iterdir()`391392Перечисляет дочерние элементы текущего каталога.393394#### `Path.is_dir()`395396Возвращает `True`, если текущий контекст ссылается на каталог.397398#### `Path.is_file()`399400Возвращает `True`, если текущий контекст ссылается на файл.401402#### `Path.is_symlink()`403404Возвращает `True`, если текущий контекст ссылается на символическую ссылку.405406Добавлено в версии 3.12.407408Изменено в версии 3.13: Ранее `is_symlink` безусловно возвращал `False`.409410#### `Path.exists()`411412Возвращает `True`, если текущий контекст ссылается на файл или каталог внутри zip-файла.413414#### `Path.suffix`415416Последняя часть конечного компонента, отделённая точкой, если таковая имеется. Обычно это называется расширением файла.417418Добавлено в версии 3.11: Добавлено свойство `Path.suffix`.419420#### `Path.stem`421422Конечный компонент пути без его суффикса.423424Добавлено в версии 3.11: Добавлено свойство `Path.stem`.425426#### `Path.suffixes`427428Список суффиксов пути, обычно называемых расширениями файлов.429430Добавлено в версии 3.11: Добавлено свойство `Path.suffixes`.431432#### `Path.read_text(*, **)`433434Читает текущий файл как текст в кодировке Unicode. Позиционные и именованные аргументы передаются в [`io.TextIOWrapper`](https://python-all.ru/3.16/library/io.html#io.TextIOWrapper) (кроме `buffer`, который подразумевается контекстом).435436Изменено в версии 3.11.2: Параметр `encoding` теперь можно передавать как позиционный аргумент, не вызывая [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError). Как это было возможно в 3.9. Код, которому требуется совместимость с неисправленными версиями 3.10 и 3.11, должен передавать все аргументы [`io.TextIOWrapper`](https://python-all.ru/3.16/library/io.html#io.TextIOWrapper), включая `encoding`, только как именованные.437438#### `Path.read_bytes()`439440Читает текущий файл как байты.441442#### `Path.joinpath(*other)`443444Возвращает новый объект Path, объединяя каждый аргумент *other*. Следующие вызовы эквивалентны:445446```python447>>> Path(...).joinpath('child').joinpath('grandchild')448>>> Path(...).joinpath('child', 'grandchild')449>>> Path(...) / 'child' / 'grandchild'450```451452Изменено в версии 3.10: До версии 3.10 `joinpath` не был документирован и принимал ровно один параметр.453454Проект [zipp](https://python-all.ru/3.16/library/zipfile.html) предоставляет обратные порты последних возможностей объекта path для старых версий Python. Используйте `zipp.Path` вместо `zipfile.Path` для раннего доступа к изменениям.455456## Объекты PyZipFile457458Конструктор [`PyZipFile`](https://python-all.ru/3.16/library/zipfile.html#zipfile.PyZipFile) принимает те же параметры, что и конструктор [`ZipFile`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile), плюс один дополнительный параметр *optimize*.459460#### `class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)`461462Изменено в версии 3.2: Добавлен параметр *optimize*.463464Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.465466Экземпляры имеют один метод в дополнение к методам [`ZipFile`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile) объектов:467468#### `writepy(pathname, basename='', filterfunc=None)`469470Ищет файлы `*.py` и добавляет соответствующий файл в архив.471472Если параметру *optimize* в `PyZipFile` не было задано значение или он равен `-1`, то соответствующим файлом является `*.pyc` файл, при необходимости компилируемый.473474Если параметру *optimize* в `PyZipFile` было задано значение `0`, `1` или `2`, в архив добавляются только файлы с таким уровнем оптимизации (см. [`compile()`](https://python-all.ru/3.16/library/functions.html#compile)), при необходимости компилируемые.475476Если *pathname* – это файл, его имя должно заканчиваться на `.py`, и в корень архива добавляется только (соответствующий `*.pyc`) файл (без информации о пути). Если *pathname* – это файл, не заканчивающийся на `.py`, будет возбуждено [`RuntimeError`](https://python-all.ru/3.16/library/exceptions.html#RuntimeError). Если это каталог и он не является каталогом пакета, то все файлы `*.pyc` добавляются в корень. Если каталог является каталогом пакета, то все `*.pyc` добавляются под именем пакета как путь к файлу, а если какие-либо подкаталоги являются каталогами пакетов, все они добавляются рекурсивно в отсортированном порядке.477478*basename* предназначен только для внутреннего использования.479480*filterfunc*, если задан, должен быть функцией, принимающей один строковый аргумент. Ей будет передаваться каждый путь (включая каждый полный путь к файлу) перед добавлением в архив. Если *filterfunc* возвращает ложное значение, путь не будет добавлен, а если это каталог, его содержимое будет проигнорировано. Например, если все наши тестовые файлы находятся в каталогах `test` или начинаются со строки `test_`, мы можем использовать *filterfunc* для их исключения:481482```python483>>> zf = PyZipFile('myprog.zip')484>>> def notests(s):485...     fn = os.path.basename(s)486...     return (not (fn == 'test' or fn.startswith('test_')))487...488>>> zf.writepy('myprog', filterfunc=notests)489```490491Метод `writepy()` создаёт архивы с именами файлов следующего вида:492493```python494string.pyc                   # Имя верхнего уровня495test/__init__.pyc            # Каталог пакета496test/testall.pyc             # Модуль test.testall497test/bogus/__init__.pyc      # Каталог подпакета498test/bogus/myfile.pyc        # Подмодуль test.bogus.myfile499```500501Изменено в версии 3.4: Добавлен параметр *filterfunc*.502503Изменено в версии 3.6.2: Параметр *pathname* теперь принимает [объект, подобный пути](https://python-all.ru/3.16/glossary.html#term-path-like-object).504505Изменено в версии 3.7: Рекурсия сортирует записи каталога.506507## Объекты ZipInfo508509Экземпляры класса [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo) возвращаются методами [`getinfo()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.getinfo) и [`infolist()`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile.infolist) объектов [`ZipFile`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipFile). Каждый объект хранит информацию об одном элементе ZIP-архива.510511Существует один метод класса для создания экземпляра [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo) для файла в файловой системе:512513#### `classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)`514515Создаёт экземпляр [`ZipInfo`](https://python-all.ru/3.16/library/zipfile.html#zipfile.ZipInfo) для файла в файловой системе, подготавливая его для добавления в zip-архив.516517Параметр *filename* должен быть путём к файлу или каталогу в файловой системе.518519Если *arcname* указан, он используется как имя внутри архива. Если *arcname* не указан, имя будет совпадать с *filename*, но без буквы диска и ведущих разделителей пути.520521Аргумент *strict\_timestamps* при значении `False` позволяет архивировать файлы старше 1980-01-01, ценой установки временной метки на 1980-01-01. Аналогичное поведение для файлов новее 2107-12-31: временная метка также устанавливается на предельное значение.522523Добавлено в версии 3.6.524525Изменено в версии 3.6.2: Параметр *filename* теперь принимает [объект, подобный пути](https://python-all.ru/3.16/glossary.html#term-path-like-object).526527Изменено в версии 3.8: Добавлен параметр *strict\_timestamps*, передаваемый только по ключу.528529Экземпляры имеют следующие методы и атрибуты:530531#### `ZipInfo.is_dir()`532533Возвращает `True`, если данный элемент архива является каталогом.534535Используется имя записи: каталоги всегда должны заканчиваться на `/`.536537Добавлено в версии 3.6.538539#### `ZipInfo.filename`540541Имя файла в архиве.542543#### `ZipInfo.date_time`544545Время и дата последнего изменения элемента архива. Это кортеж из шести значений, представляющих поля «время последнего изменения файла» и «дата последнего изменения файла» из центрального каталога ZIP-файла.546547Кортеж содержит:548549| Индекс | Значение |550| --- | --- |551| `0` | Год (\>= 1980) |552| `1` | Месяц (начиная с 1) |553| `2` | День месяца (начиная с 1) |554| `3` | Часы (начиная с 0) |555| `4` | Минуты (начиная с 0) |556| `5` | Секунды (начиная с 0) |557558> **Примечание**559>560> Формат ZIP поддерживает несколько полей временных меток в разных местах (центральный каталог, дополнительные поля для систем NTFS/UNIX и т.д.). Данный атрибут возвращает метку времени именно из центрального каталога. Формат временной метки центрального каталога в ZIP-файлах не поддерживает метки до 1980 года. Хотя некоторые форматы дополнительных полей (например, метки UNIX) могут представлять более ранние даты, этот атрибут возвращает только метку из центрального каталога.561>562> Временная метка центрального каталога интерпретируется как местное время, а не UTC, чтобы соответствовать поведению других zip-инструментов.563564#### `ZipInfo.compress_type`565566Тип сжатия для элемента архива.567568#### `ZipInfo.comment`569570Комментарий для отдельного элемента архива в виде объекта [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes).571572#### `ZipInfo.extra`573574Данные поля расширения. [Примечание к приложению PKZIP](https://python-all.ru/3.16/library/zipfile.html) содержит некоторые комментарии о внутренней структуре данных, содержащихся в этом объекте [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes).575576#### `ZipInfo.create_system`577578Система, создавшая ZIP-архив.579580#### `ZipInfo.create_version`581582Версия PKZIP, создавшая ZIP-архив.583584#### `ZipInfo.extract_version`585586Версия PKZIP, необходимая для извлечения архива.587588#### `ZipInfo.reserved`589590Должно быть равно нулю.591592#### `ZipInfo.flag_bits`593594Биты флагов ZIP.595596#### `ZipInfo.volume`597598Номер тома заголовка файла.599600#### `ZipInfo.internal_attr`601602Внутренние атрибуты.603604#### `ZipInfo.external_attr`605606Внешние атрибуты файла.607608#### `ZipInfo.header_offset`609610Смещение в байтах до заголовка файла.611612#### `ZipInfo.CRC`613614CRC-32 несжатого файла.615616#### `ZipInfo.compress_size`617618Размер сжатых данных.619620#### `ZipInfo.file_size`621622Размер несжатого файла.623624## Интерфейс командной строки625626Модуль `zipfile` предоставляет простой интерфейс командной строки для работы с ZIP-архивами.627628Чтобы создать новый ZIP-архив, укажите его имя после параметра [`-c`](https://python-all.ru/3.16/library/zipfile.html#cmdoption-zipfile-c) и перечислите имена файлов, которые нужно включить:629630```console631$ python -m zipfile -c monty.zip spam.txt eggs.txt632```633634Можно также передать каталог:635636```console637$ python -m zipfile -c monty.zip life-of-brian_1979/638```639640Чтобы извлечь ZIP-архив в указанный каталог, используйте параметр [`-e`](https://python-all.ru/3.16/library/zipfile.html#cmdoption-zipfile-e):641642```console643$ python -m zipfile -e monty.zip target-dir/644```645646Для получения списка файлов в ZIP-архиве используйте параметр [`-l`](https://python-all.ru/3.16/library/zipfile.html#cmdoption-zipfile-l):647648```console649$ python -m zipfile -l monty.zip650```651652### Параметры командной строки653654#### `-l <zipfile>`655656#### `--list <zipfile>`657658Выводит список файлов в ZIP-архиве.659660#### `-c <zipfile> <source1> ... <sourceN>`661662#### `--create <zipfile> <source1> ... <sourceN>`663664Создать zip-файл из исходных файлов.665666#### `-e <zipfile> <output_dir>`667668#### `--extract <zipfile> <output_dir>`669670Извлечь zip-файл в целевой каталог.671672#### `-t <zipfile>`673674#### `--test <zipfile>`675676Проверить, корректен ли zip-файл.677678#### `--metadata-encoding <encoding>`679680Указать кодировку имён элементов для [`-l`](https://python-all.ru/3.16/library/zipfile.html#cmdoption-zipfile-l), [`-e`](https://python-all.ru/3.16/library/zipfile.html#cmdoption-zipfile-e) и [`-t`](https://python-all.ru/3.16/library/zipfile.html#cmdoption-zipfile-t).681682Добавлено в версии 3.12.683684## Подводные камни распаковки685686Извлечение в модуле zipfile может завершиться неудачей из-за некоторых подводных камней, перечисленных ниже.687688### Проблемы, связанные с файлом689690Распаковка может не удаться из-за неверного пароля, несовпадения контрольной суммы CRC, неверного формата ZIP, неподдерживаемого метода сжатия или шифрования.691692### Ограничения файловой системы693694Превышение ограничений разных файловых систем может привести к сбою распаковки. Например, допустимые символы в записях каталогов, длина имени файла, длина полного пути, размер отдельного файла, количество файлов и т.д.695696### Ограничения ресурсов697698Нехватка памяти или дискового пространства может привести к сбою распаковки. Например, бомбы распаковки (также известные как [ZIP-бомбы](https://python-all.ru/3.16/library/zipfile.html)) применимы к библиотеке zipfile и могут вызвать исчерпание дискового пространства.699700### Прерывание701702Прерывание в процессе распаковки, например нажатие Control-C или завершение процесса распаковки, может привести к неполной распаковке архива.703704### Действия по умолчанию при извлечении705706Незнание действий по умолчанию при извлечении может привести к неожиданным результатам распаковки. Например, при повторном извлечении одного и того же архива файлы перезаписываются без запроса.707