zipfile.md
1> **Источник:** https://python-all.ru/3.9/library/zipfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`zipfile`](https://python-all.ru/3.9/library/zipfile.html#module-zipfile) – Работа с ZIP-архивами89**Исходный код:** [Lib/zipfile.py](https://python-all.ru/src/3.9/Lib/zipfile.py)1011---1213Формат ZIP – распространённый стандарт архивации и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и просмотра содержимого ZIP-файлов. Любое продвинутое использование модуля требует понимания формата, описанного в [PKZIP Application Note](https://python-all.ru/3.9/library/zipfile.html).1415Модуль пока не поддерживает многодисковые ZIP-файлы. Он может обрабатывать ZIP-файлы, использующие расширения ZIP64 (то есть ZIP-файлы размером более 4 ГБ). Поддерживается расшифровка зашифрованных файлов в ZIP-архивах, но пока невозможно создать зашифрованный файл. Расшифровка выполняется очень медленно, так как реализована на чистом Python, а не на C.1617Модуль определяет следующие элементы:1819#### `exception zipfile.BadZipFile`2021Исключение, возникающее при повреждённых ZIP-файлах.2223Новое в версии 3.2.2425#### `exception zipfile.BadZipfile`2627Псевдоним [`BadZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.BadZipFile) для совместимости со старыми версиями Python.2829Устарело с версии 3.2.3031#### `exception zipfile.LargeZipFile`3233Исключение, возникающее, когда ZIP-файлу требуется функциональность ZIP64, но она не включена.3435#### `class zipfile.ZipFile`3637Класс для чтения и записи ZIP-файлов. Подробнее о конструкторе см. раздел [Объекты ZipFile](https://python-all.ru/3.9/library/zipfile.html#zipfile-objects).3839#### `class zipfile.Path`4041Обёртка для ZIP-файлов, совместимая с pathlib. Подробнее см. раздел [Объекты Path](https://python-all.ru/3.9/library/zipfile.html#path-objects).4243Новое в версии 3.8.4445#### `class zipfile.PyZipFile`4647Класс для создания ZIP-архивов, содержащих библиотеки Python.4849#### `class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))`5051Класс для представления информации об элементе архива. Экземпляры этого класса возвращаются методами [`getinfo()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.getinfo) и [`infolist()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.infolist) объектов [`ZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile). Большинству пользователей модуля [`zipfile`](https://python-all.ru/3.9/library/zipfile.html#module-zipfile) не потребуется создавать их самостоятельно – достаточно использовать те, что созданы этим модулем. *filename* должен содержать полное имя элемента архива, а *date\_time* – кортеж из шести полей, описывающих время последнего изменения файла. Описание полей приведено в разделе [Объекты ZipInfo](https://python-all.ru/3.9/library/zipfile.html#zipinfo-objects).5253#### `zipfile.is_zipfile(filename)`5455Возвращает `True`, если *filename* является корректным ZIP-файлом (проверка по магическому числу), иначе возвращает `False`. *filename* может быть файлом или файлоподобным объектом.5657Изменено в версии 3.1: Добавлена поддержка файлов и файлоподобных объектов.5859#### `zipfile.ZIP_STORED`6061Числовая константа для несжатого элемента архива.6263#### `zipfile.ZIP_DEFLATED`6465Числовая константа для стандартного метода сжатия ZIP. Требует модуль [`zlib`](https://python-all.ru/3.9/library/zlib.html#module-zlib).6667#### `zipfile.ZIP_BZIP2`6869Числовая константа для метода сжатия BZIP2. Для этого требуется модуль [`bz2`](https://python-all.ru/3.9/library/bz2.html#module-bz2).7071Новое в версии 3.3.7273#### `zipfile.ZIP_LZMA`7475Числовая константа для метода сжатия LZMA. Для этого требуется модуль [`lzma`](https://python-all.ru/3.9/library/lzma.html#module-lzma).7677Новое в версии 3.3.7879> **Примечание**80>81> Спецификация формата ZIP поддерживает сжатие bzip2 с 2001 года и сжатие LZMA с 2006 года. Однако некоторые инструменты (включая старые версии Python) не поддерживают эти методы сжатия и могут либо полностью отказаться обрабатывать ZIP-файл, либо не извлечь отдельные файлы.8283> **См. также**84>85> **[Примечание по применению PKZIP](https://python-all.ru/3.9/library/zipfile.html)**86>87> Документация по формату ZIP-файлов от Фила Каца, создателя формата и используемых алгоритмов.88>89> **[Домашняя страница Info-ZIP](https://python-all.ru/3.9/library/zipfile.html)**90>91> Информация о программах для работы с ZIP-архивами и библиотеках для разработки проекта Info-ZIP.9293## Объекты ZipFile9495#### `class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True)`9697Открывает ZIP-файл, где *file* может быть путём к файлу (строка), файлоподобным объектом или [объектом, подобным пути](https://python-all.ru/3.9/glossary.html#term-path-like-object).9899Параметр *mode* должен быть `'r'` для чтения существующего файла, `'w'` для усечения и записи нового файла, `'a'` для добавления к существующему файлу или `'x'` для исключительного создания и записи нового файла. Если *mode* равен `'x'` и *file* указывает на существующий файл, будет вызвано исключение [`FileExistsError`](https://python-all.ru/3.9/library/exceptions.html#FileExistsError). Если *mode* равен `'a'` и *file* указывает на существующий ZIP-файл, в него добавляются дополнительные файлы. Если *file* не указывает на ZIP-файл, то в конец файла добавляется новый ZIP-архив. Это предназначено для добавления ZIP-архива в другой файл (например, `python.exe`). Если *mode* равен `'a'` и файл вообще не существует, он создаётся. Если *mode* равен `'r'` или `'a'`, файл должен поддерживать позиционирование.100101Параметр *compression* задает метод сжатия ZIP, используемый при записи архива; это должно быть [`ZIP_STORED`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_STORED), [`ZIP_DEFLATED`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_DEFLATED), [`ZIP_BZIP2`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_BZIP2) или [`ZIP_LZMA`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_LZMA); неподдерживаемые значения приведут к возбуждению [`NotImplementedError`](https://python-all.ru/3.9/library/exceptions.html#NotImplementedError). Если указано [`ZIP_DEFLATED`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_DEFLATED), [`ZIP_BZIP2`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_BZIP2) или [`ZIP_LZMA`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_LZMA), но соответствующий модуль ([`zlib`](https://python-all.ru/3.9/library/zlib.html#module-zlib), [`bz2`](https://python-all.ru/3.9/library/bz2.html#module-bz2) или [`lzma`](https://python-all.ru/3.9/library/lzma.html#module-lzma)) недоступен, возбуждается [`RuntimeError`](https://python-all.ru/3.9/library/exceptions.html#RuntimeError). По умолчанию используется [`ZIP_STORED`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_STORED).102103Если *allowZip64* равен `True` (по умолчанию), zipfile будет создавать ZIP-файлы с расширениями ZIP64, когда размер zip-файла превышает 4 ГиБ. Если он равен `false`, [`zipfile`](https://python-all.ru/3.9/library/zipfile.html#module-zipfile) возбудит исключение, когда ZIP-файлу потребуются расширения ZIP64.104105Параметр *compresslevel* управляет уровнем сжатия при записи файлов в архив. При использовании [`ZIP_STORED`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_STORED) или [`ZIP_LZMA`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_LZMA) он не влияет. При использовании [`ZIP_DEFLATED`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_DEFLATED) принимаются целые числа от `0` до `9` (подробнее см. [`zlib`](https://python-all.ru/3.9/library/zlib.html#zlib.compressobj)). При использовании [`ZIP_BZIP2`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_BZIP2) принимаются целые числа от `1` до `9` (подробнее см. [`bz2`](https://python-all.ru/3.9/library/bz2.html#bz2.BZ2File)).106107Аргумент *strict\_timestamps* при значении `False` позволяет архивировать файлы старше 1980-01-01, ценой установки временной метки на 1980-01-01. Аналогичное поведение для файлов новее 2107-12-31: временная метка также устанавливается на предельное значение.108109Если файл создан с режимом `'w'`, `'x'` или `'a'`, а затем [`closed`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.close) без добавления каких-либо файлов в архив, в файл будут записаны соответствующие структуры ZIP для пустого архива.110111ZipFile также является контекстным менеджером и поэтому поддерживает оператор [`with`](https://python-all.ru/3.9/reference/compound_stmts.html#with). В примере *myzip* закрывается после завершения блока оператора `with` – даже если возникло исключение:112113```python114with ZipFile('spam.zip', 'w') as myzip:115 myzip.write('eggs.txt')116```117118Новое в версии 3.2: Добавлена возможность использовать [`ZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile) в качестве менеджера контекста.119120Изменено в версии 3.3: Добавлена поддержка сжатия [`bzip2`](https://python-all.ru/3.9/library/bz2.html#module-bz2) и [`lzma`](https://python-all.ru/3.9/library/lzma.html#module-lzma).121122Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.123124Изменено в версии 3.5: Добавлена поддержка записи в непозиционируемые потоки. Добавлена поддержка режима `'x'`.125126Изменено в версии 3.6: Ранее для нераспознанных значений сжатия возбуждалось простое исключение [`RuntimeError`](https://python-all.ru/3.9/library/exceptions.html#RuntimeError).127128Изменено в версии 3.6.2: Параметр *file* принимает [объект, подобный пути](https://python-all.ru/3.9/glossary.html#term-path-like-object).129130Изменено в версии 3.7: Добавлен параметр *compresslevel*.131132Новое в версии 3.8: Аргумент *strict\_timestamps*, передаваемый только по имени133134#### `ZipFile.close()`135136Закрывает файл архива. Перед выходом из программы необходимо вызвать [`close()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.close), иначе важные записи не будут записаны.137138#### `ZipFile.getinfo(name)`139140Возвращает объект [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo) с информацией об элементе архива *name*. Вызов [`getinfo()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.getinfo) для имени, отсутствующего в архиве, приведёт к возникновению исключения [`KeyError`](https://python-all.ru/3.9/library/exceptions.html#KeyError).141142#### `ZipFile.infolist()`143144Возвращает список, содержащий объект [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo) для каждого элемента архива. Объекты расположены в том же порядке, что и их записи в реальном ZIP-файле на диске, если был открыт существующий архив.145146#### `ZipFile.namelist()`147148Возвращает список элементов архива по именам.149150#### `ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)`151152Открывает элемент архива как бинарный файлоподобный объект. *name* может быть именем файла внутри архива или объектом [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo). Параметр *mode*, если указан, должен быть равен `'r'` (по умолчанию) или `'w'`. *pwd* – пароль для расшифровки зашифрованных ZIP-файлов.153154[`open()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.open) также является контекстным менеджером и поэтому поддерживает оператор [`with`](https://python-all.ru/3.9/reference/compound_stmts.html#with):155156```python157with ZipFile('spam.zip') as myzip:158 with myzip.open('eggs.txt') as myfile:159 print(myfile.read())160```161162При *mode* `'r'` файлоподобный объект (`ZipExtFile`) доступен только для чтения и предоставляет следующие методы: [`read()`](https://python-all.ru/3.9/library/io.html#io.BufferedIOBase.read), [`readline()`](https://python-all.ru/3.9/library/io.html#io.IOBase.readline), [`readlines()`](https://python-all.ru/3.9/library/io.html#io.IOBase.readlines), [`seek()`](https://python-all.ru/3.9/library/io.html#io.IOBase.seek), [`tell()`](https://python-all.ru/3.9/library/io.html#io.IOBase.tell), [`__iter__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__iter__), [`__next__()`](https://python-all.ru/3.9/library/stdtypes.html#iterator.__next__). Эти объекты могут работать независимо от ZipFile.163164При `mode='w'` возвращается дескриптор файла для записи, который поддерживает метод [`write()`](https://python-all.ru/3.9/library/io.html#io.BufferedIOBase.write). Пока дескриптор для записи открыт, попытка чтения или записи других файлов в ZIP-архиве приведёт к возникновению исключения [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError).165166При записи файла, если размер файла заранее неизвестен, но может превысить 2 ГБ, передайте `force_zip64=True`, чтобы формат заголовка мог поддерживать большие файлы. Если размер файла известен заранее, создайте объект [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo) с установленным [`file_size`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo.file_size) и используйте его в качестве параметра *name*.167168> **Примечание**169>170> Методы [`open()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.open), [`read()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.read) и [`extract()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.extract) могут принимать имя файла или объект [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo). Это пригодится при попытке чтения ZIP-файла, содержащего элементы с повторяющимися именами.171172Изменено в версии 3.6: Удалена поддержка `mode='U'`. Используйте [`io.TextIOWrapper`](https://python-all.ru/3.9/library/io.html#io.TextIOWrapper) для чтения сжатых текстовых файлов в режиме [универсальные символы новой строки](https://python-all.ru/3.9/glossary.html#term-universal-newlines).173174Изменено в версии 3.6: Теперь [`ZipFile.open()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.open) можно использовать для записи файлов в архив с опцией `mode='w'`.175176Изменено в версии 3.6: Вызов [`open()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.open) для закрытого ZipFile приводит к исключению [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.9/library/exceptions.html#RuntimeError).177178#### `ZipFile.extract(member, path=None, pwd=None)`179180Извлекает элемент из архива в текущую рабочую директорию. *member* должно быть полным именем файла или объектом [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo). Информация о файле извлекается максимально точно. *path* задаёт другую директорию для извлечения. *member* может быть именем файла или объектом [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo). *pwd* – пароль для зашифрованных файлов.181182Возвращает нормализованный путь (каталог или новый файл).183184> **Примечание**185>186> Если имя файла элемента является абсолютным путём, диск/UNC-точка и начальные (обратные) слеши будут удалены, например: `///foo/bar` становится `foo/bar` на Unix, а `C:\foo\bar` становится `foo\bar` на Windows. Все компоненты `".."` в имени файла элемента будут удалены, например: `../../foo../../ba..r` становится `foo../ba..r`. На Windows недопустимые символы (`:`, `<`, `>`, `|`, `"`, `?` и `*`) заменяются подчёркиванием (`_`).187188Изменено в версии 3.6: Вызов [`extract()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.extract) для закрытого ZipFile приводит к исключению [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.9/library/exceptions.html#RuntimeError).189190Изменено в версии 3.6.2: Параметр *path* принимает [объект, подобный пути](https://python-all.ru/3.9/glossary.html#term-path-like-object).191192#### `ZipFile.extractall(path=None, members=None, pwd=None)`193194Извлекает все элементы из архива в текущую рабочую директорию. *path* задаёт другую директорию для извлечения. *members* – необязательный параметр, должен быть подмножеством списка, возвращаемого [`namelist()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.namelist). *pwd* – пароль для зашифрованных файлов.195196> **Предупреждение**197>198> Никогда не извлекайте архивы из ненадёжных источников без предварительной проверки. Существует вероятность создания файлов за пределами *path*, например, элементы с абсолютными именами файлов, начинающимися с `"/"`, или имена файлов с двумя точками `".."`. Модуль пытается предотвратить это. См. примечание [`extract()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.extract).199200Изменено в версии 3.6: Вызов [`extractall()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.extractall) для закрытого ZipFile приводит к исключению [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.9/library/exceptions.html#RuntimeError).201202Изменено в версии 3.6.2: Параметр *path* принимает [объект, подобный пути](https://python-all.ru/3.9/glossary.html#term-path-like-object).203204#### `ZipFile.printdir()`205206Выводит оглавление архива в `sys.stdout`.207208#### `ZipFile.setpassword(pwd)`209210Устанавливает *pwd* в качестве пароля по умолчанию для извлечения зашифрованных файлов.211212#### `ZipFile.read(name, pwd=None)`213214Возвращает байты файла *name* из архива. *name* – это имя файла в архиве или объект [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo). Архив должен быть открыт для чтения или добавления. *pwd* – пароль для зашифрованных файлов; если указан, он переопределяет пароль по умолчанию, заданный с помощью [`setpassword()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.setpassword). Вызов [`read()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.read) для ZipFile, использующего метод сжатия, отличный от [`ZIP_STORED`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_STORED), [`ZIP_DEFLATED`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_DEFLATED), [`ZIP_BZIP2`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_BZIP2) или [`ZIP_LZMA`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_LZMA), вызовет [`NotImplementedError`](https://python-all.ru/3.9/library/exceptions.html#NotImplementedError). Ошибка также возникнет, если соответствующий модуль сжатия недоступен.215216Изменено в версии 3.6: Вызов [`read()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.read) для закрытого ZipFile приводит к исключению [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.9/library/exceptions.html#RuntimeError).217218#### `ZipFile.testzip()`219220Читает все файлы архива и проверяет их CRC и заголовки файлов. Возвращает имя первого повреждённого файла или `None`.221222Изменено в версии 3.6: Вызов [`testzip()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.testzip) для закрытого ZipFile приводит к исключению [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.9/library/exceptions.html#RuntimeError).223224#### `ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)`225226Записывает файл с именем *filename* в архив, присваивая ему архивное имя *arcname* (по умолчанию оно совпадает с *filename*, но без буквы диска и с удалёнными начальными разделителями путей). Если указан, *compress\_type* переопределяет значение, переданное в параметре *compression* конструктору для новой записи. Аналогично, *compresslevel* переопределит конструктор, если указан. Архив должен быть открыт с режимом `'w'`, `'x'` или `'a'`.227228> **Примечание**229>230> Архивные имена должны быть относительными по отношению к корню архива, то есть не должны начинаться с разделителя пути.231232> **Примечание**233>234> Если `arcname` (или `filename`, если `arcname` не указан) содержит нулевой байт, имя файла в архиве будет обрезано по этому байту.235236> **Примечание**237>238> Начальный слэш в имени файла может привести к невозможности открытия архива в некоторых ZIP-программах в системах Windows.239240Изменено в версии 3.6: Вызов [`write()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.write) для ZipFile, созданного с режимом `'r'`, или для закрытого ZipFile приведёт к исключению [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.9/library/exceptions.html#RuntimeError).241242#### `ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)`243244Записывает файл в архив. Содержимое – это *data*, который может быть экземпляром [`str`](https://python-all.ru/3.9/library/stdtypes.html#str) или [`bytes`](https://python-all.ru/3.9/library/stdtypes.html#bytes); если это [`str`](https://python-all.ru/3.9/library/stdtypes.html#str), то он сначала кодируется в UTF-8. *zinfo\_or\_arcname* – это либо имя файла, которое он получит в архиве, либо экземпляр [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo). Если это экземпляр, должны быть указаны как минимум имя файла, дата и время. Если это имя, дата и время устанавливаются на текущие дату и время. Архив должен быть открыт с режимом `'w'`, `'x'` или `'a'`.245246Если указан, *compress\_type* переопределяет значение, переданное в параметре *compression* конструктору для новой записи, или значение в *zinfo\_or\_arcname* (если это экземпляр [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo)). Аналогично, *compresslevel* переопределит конструктор, если указан.247248> **Примечание**249>250> При передаче экземпляра [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo) в качестве параметра *zinfo\_or\_arcname* используемый метод сжатия будет тем, который указан в элементе *compress\_type* данного экземпляра [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo). По умолчанию конструктор [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo) устанавливает этот элемент в [`ZIP_STORED`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZIP_STORED).251252Изменено в версии 3.2: Аргумент *compress\_type*.253254Изменено в версии 3.6: Вызов [`writestr()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.writestr) для ZipFile, созданного с режимом `'r'`, или для закрытого ZipFile приведёт к исключению [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError). Ранее вызывалось исключение [`RuntimeError`](https://python-all.ru/3.9/library/exceptions.html#RuntimeError).255256Также доступны следующие атрибуты данных:257258#### `ZipFile.filename`259260Имя ZIP-файла.261262#### `ZipFile.debug`263264Уровень отладочного вывода. Может быть установлен от `0` (по умолчанию, без вывода) до `3` (максимальный вывод). Отладочная информация записывается в `sys.stdout`.265266#### `ZipFile.comment`267268Комментарий, связанный с ZIP-файлом, в виде объекта [`bytes`](https://python-all.ru/3.9/library/stdtypes.html#bytes). Если присваивать комментарий экземпляру [`ZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile), созданному с режимом `'w'`, `'x'` или `'a'`, его длина не должна превышать 65535 байт. Комментарии длиннее этого будут обрезаны.269270## Объекты Path271272#### `class zipfile.Path(root, at='')`273274Создаёт объект Path из zip-файла `root` (который может быть экземпляром [`ZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile) или `file`, подходящим для передачи в конструктор [`ZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile)).275276`at` задаёт расположение этого Path внутри zip-файла, например, ‘dir/file.txt’, ‘dir/’ или ‘’. По умолчанию – пустая строка, что означает корень.277278Объекты Path предоставляют следующие возможности объектов [`pathlib.Path`](https://python-all.ru/3.9/library/pathlib.html#pathlib.Path) :279280Объекты Path можно обходить с помощью оператора `/`.281282#### `Path.name`283284Последний компонент пути.285286#### `Path.open(mode='r', *, pwd, **)`287288Вызывает [`ZipFile.open()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.open) для текущего пути. Позволяет открывать для чтения или записи, в текстовом или двоичном режиме через поддерживаемые режимы: ‘r’, ‘w’, ‘rb’, ‘wb’. Позиционные и именованные аргументы передаются в [`io.TextIOWrapper`](https://python-all.ru/3.9/library/io.html#io.TextIOWrapper) при открытии как текст и игнорируются в противном случае. `pwd` – это параметр `pwd` для [`ZipFile.open()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.open).289290Изменено в версии 3.9: Добавлена поддержка текстового и двоичного режимов для open. Режим по умолчанию теперь текстовый.291292#### `Path.iterdir()`293294Перечисляет дочерние элементы текущего каталога.295296#### `Path.is_dir()`297298Возвращает `True`, если текущий контекст ссылается на каталог.299300#### `Path.is_file()`301302Возвращает `True`, если текущий контекст ссылается на файл.303304#### `Path.exists()`305306Возвращает `True`, если текущий контекст ссылается на файл или каталог внутри zip-файла.307308#### `Path.read_text(*, **)`309310Читает текущий файл как текст в кодировке Unicode. Позиционные и именованные аргументы передаются в [`io.TextIOWrapper`](https://python-all.ru/3.9/library/io.html#io.TextIOWrapper) (кроме `buffer`, который подразумевается контекстом).311312#### `Path.read_bytes()`313314Читает текущий файл как байты.315316## Объекты PyZipFile317318Конструктор [`PyZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.PyZipFile) принимает те же параметры, что и конструктор [`ZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile), плюс один дополнительный параметр *optimize*.319320#### `class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)`321322Новое в версии 3.2: Параметр *optimize*.323324Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.325326Экземпляры имеют один метод в дополнение к методам [`ZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile) объектов:327328#### `writepy(pathname, basename='', filterfunc=None)`329330Ищет файлы `*.py` и добавляет соответствующий файл в архив.331332Если параметру *optimize* в [`PyZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.PyZipFile) не было задано значение или он равен `-1`, то соответствующим файлом является `*.pyc` файл, при необходимости компилируемый.333334Если параметру *optimize* в [`PyZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.PyZipFile) было задано значение `0`, `1` или `2`, в архив добавляются только файлы с таким уровнем оптимизации (см. [`compile()`](https://python-all.ru/3.9/library/functions.html#compile)), при необходимости компилируемые.335336Если *pathname* – это файл, его имя должно заканчиваться на `.py`, и в корень архива добавляется только (соответствующий `*.pyc`) файл (без информации о пути). Если *pathname* – это файл, не заканчивающийся на `.py`, будет возбуждено [`RuntimeError`](https://python-all.ru/3.9/library/exceptions.html#RuntimeError). Если это каталог и он не является каталогом пакета, то все файлы `*.pyc` добавляются в корень. Если каталог является каталогом пакета, то все `*.pyc` добавляются под именем пакета как путь к файлу, а если какие-либо подкаталоги являются каталогами пакетов, все они добавляются рекурсивно в отсортированном порядке.337338*basename* предназначен только для внутреннего использования.339340*filterfunc*, если задан, должен быть функцией, принимающей один строковый аргумент. Ей будет передаваться каждый путь (включая каждый полный путь к файлу) перед добавлением в архив. Если *filterfunc* возвращает ложное значение, путь не будет добавлен, а если это каталог, его содержимое будет проигнорировано. Например, если все наши тестовые файлы находятся в каталогах `test` или начинаются со строки `test_`, мы можем использовать *filterfunc* для их исключения:341342```python343>>> zf = PyZipFile('myprog.zip')344>>> def notests(s):345... fn = os.path.basename(s)346... return (not (fn == 'test' or fn.startswith('test_')))347>>> zf.writepy('myprog', filterfunc=notests)348```349350Метод [`writepy()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.PyZipFile.writepy) создаёт архивы с именами файлов следующего вида:351352```python353string.pyc # Имя верхнего уровня354test/__init__.pyc # Каталог пакета355test/testall.pyc # Модуль test.testall356test/bogus/__init__.pyc # Каталог подпакета357test/bogus/myfile.pyc # Подмодуль test.bogus.myfile358```359360Новое в версии 3.4: Параметр *filterfunc*.361362Изменено в версии 3.6.2: Параметр *pathname* теперь принимает [объект, подобный пути](https://python-all.ru/3.9/glossary.html#term-path-like-object).363364Изменено в версии 3.7: Рекурсия сортирует записи каталога.365366## Объекты ZipInfo367368Экземпляры класса [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo) возвращаются методами [`getinfo()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.getinfo) и [`infolist()`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile.infolist) объектов [`ZipFile`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipFile). Каждый объект хранит информацию об одном элементе ZIP-архива.369370Существует один метод класса для создания экземпляра [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo) для файла в файловой системе:371372#### `classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)`373374Создаёт экземпляр [`ZipInfo`](https://python-all.ru/3.9/library/zipfile.html#zipfile.ZipInfo) для файла в файловой системе, подготавливая его для добавления в zip-архив.375376Параметр *filename* должен быть путём к файлу или каталогу в файловой системе.377378Если *arcname* указан, он используется как имя внутри архива. Если *arcname* не указан, имя будет совпадать с *filename*, но без буквы диска и ведущих разделителей пути.379380Аргумент *strict\_timestamps* при значении `False` позволяет архивировать файлы старше 1980-01-01, ценой установки временной метки на 1980-01-01. Аналогичное поведение для файлов новее 2107-12-31: временная метка также устанавливается на предельное значение.381382Новое в версии 3.6.383384Изменено в версии 3.6.2: Параметр *filename* теперь принимает [объект, подобный пути](https://python-all.ru/3.9/glossary.html#term-path-like-object).385386Новое в версии 3.8: Аргумент *strict\_timestamps*, передаваемый только по имени387388Экземпляры имеют следующие методы и атрибуты:389390#### `ZipInfo.is_dir()`391392Возвращает `True`, если данный элемент архива является каталогом.393394Используется имя записи: каталоги всегда должны заканчиваться на `/`.395396Новое в версии 3.6.397398#### `ZipInfo.filename`399400Имя файла в архиве.401402#### `ZipInfo.date_time`403404Время и дата последнего изменения элемента архива. Это кортеж из шести значений:405406| Индекс | Значение |407| --- | --- |408| `0` | Год (\>= 1980) |409| `1` | Месяц (начиная с 1) |410| `2` | День месяца (начиная с 1) |411| `3` | Часы (начиная с 0) |412| `4` | Минуты (начиная с 0) |413| `5` | Секунды (начиная с 0) |414415> **Примечание**416>417> Формат ZIP-файлов не поддерживает метки времени до 1980 года.418419#### `ZipInfo.compress_type`420421Тип сжатия для элемента архива.422423#### `ZipInfo.comment`424425Комментарий для отдельного элемента архива в виде объекта [`bytes`](https://python-all.ru/3.9/library/stdtypes.html#bytes).426427#### `ZipInfo.extra`428429Данные поля расширения. [Примечание к приложению PKZIP](https://python-all.ru/3.9/library/zipfile.html) содержит некоторые комментарии о внутренней структуре данных, содержащихся в этом объекте [`bytes`](https://python-all.ru/3.9/library/stdtypes.html#bytes).430431#### `ZipInfo.create_system`432433Система, создавшая ZIP-архив.434435#### `ZipInfo.create_version`436437Версия PKZIP, создавшая ZIP-архив.438439#### `ZipInfo.extract_version`440441Версия PKZIP, необходимая для извлечения архива.442443#### `ZipInfo.reserved`444445Должно быть равно нулю.446447#### `ZipInfo.flag_bits`448449Биты флагов ZIP.450451#### `ZipInfo.volume`452453Номер тома заголовка файла.454455#### `ZipInfo.internal_attr`456457Внутренние атрибуты.458459#### `ZipInfo.external_attr`460461Внешние атрибуты файла.462463#### `ZipInfo.header_offset`464465Смещение в байтах до заголовка файла.466467#### `ZipInfo.CRC`468469CRC-32 несжатого файла.470471#### `ZipInfo.compress_size`472473Размер сжатых данных.474475#### `ZipInfo.file_size`476477Размер несжатого файла.478479## Интерфейс командной строки480481Модуль [`zipfile`](https://python-all.ru/3.9/library/zipfile.html#module-zipfile) предоставляет простой интерфейс командной строки для работы с ZIP-архивами.482483Чтобы создать новый ZIP-архив, укажите его имя после параметра [`-c`](https://python-all.ru/3.9/library/zipfile.html#cmdoption-zipfile-c) и перечислите имена файлов, которые нужно включить:484485```console486$ python -m zipfile -c monty.zip spam.txt eggs.txt487```488489Можно также передать каталог:490491```console492$ python -m zipfile -c monty.zip life-of-brian_1979/493```494495Чтобы извлечь ZIP-архив в указанный каталог, используйте параметр [`-e`](https://python-all.ru/3.9/library/zipfile.html#cmdoption-zipfile-e):496497```console498$ python -m zipfile -e monty.zip target-dir/499```500501Для получения списка файлов в ZIP-архиве используйте параметр [`-l`](https://python-all.ru/3.9/library/zipfile.html#cmdoption-zipfile-l):502503```console504$ python -m zipfile -l monty.zip505```506507### Параметры командной строки508509#### `-l <zipfile>`510511#### `--list <zipfile>`512513Выводит список файлов в ZIP-архиве.514515#### `-c <zipfile> <source1> ... <sourceN>`516517#### `--create <zipfile> <source1> ... <sourceN>`518519Создать zip-файл из исходных файлов.520521#### `-e <zipfile> <output_dir>`522523#### `--extract <zipfile> <output_dir>`524525Извлечь zip-файл в целевой каталог.526527#### `-t <zipfile>`528529#### `--test <zipfile>`530531Проверить, корректен ли zip-файл.532533## Подводные камни распаковки534535Извлечение в модуле zipfile может завершиться неудачей из-за некоторых подводных камней, перечисленных ниже.536537### Проблемы, связанные с файлом538539Распаковка может не удаться из-за неверного пароля, несовпадения контрольной суммы CRC, неверного формата ZIP, неподдерживаемого метода сжатия или шифрования.540541### Ограничения файловой системы542543Превышение ограничений разных файловых систем может привести к сбою распаковки. Например, допустимые символы в записях каталогов, длина имени файла, длина полного пути, размер отдельного файла, количество файлов и т.д.544545### Ограничения ресурсов546547Нехватка памяти или дискового пространства может привести к сбою распаковки. Например, бомбы распаковки (также известные как [ZIP-бомбы](https://python-all.ru/3.9/library/zipfile.html)) применимы к библиотеке zipfile и могут вызвать исчерпание дискового пространства.548549### Прерывание550551Прерывание в процессе распаковки, например нажатие Control-C или завершение процесса распаковки, может привести к неполной распаковке архива.552553### Действия по умолчанию при извлечении554555Незнание действий по умолчанию при извлечении может привести к неожиданным результатам распаковки. Например, при повторном извлечении одного и того же архива файлы перезаписываются без запроса.556