> **Источник:** https://python-all.ru/3.0/library/zipfile.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `zipfile` – Работа с ZIP-архивами

Формат ZIP – распространённый стандарт архивации и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и просмотра содержимого ZIP-файлов. Любое продвинутое использование модуля требует понимания формата, описанного в [PKZIP Application Note](https://python-all.ru/3.0/library/zipfile.html).

Этот модуль в настоящее время не поддерживает многодисковые ZIP-файлы или ZIP-файлы с добавленными комментариями (хотя он корректно обрабатывает комментарии, добавленные к отдельным элементам архива – см. документацию [*ZipInfo Objects*](https://python-all.ru/3.0/library/zipfile.html#zipinfo-objects)). Он может обрабатывать ZIP-файлы, использующие расширения ZIP64 (то есть ZIP-файлы размером более 4 Гбайт). Поддерживается расшифровка зашифрованных файлов в ZIP-архивах, но создать зашифрованный файл в настоящее время невозможно. Расшифровка выполняется крайне медленно, так как реализована на чистом Python, а не на C.

О других форматах архивов см. модули [`bz2`](https://python-all.ru/3.0/library/bz2.html#module-bz2), [`gzip`](https://python-all.ru/3.0/library/gzip.html#module-gzip) и [`tarfile`](https://python-all.ru/3.0/library/tarfile.html#module-tarfile).

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

#### `[zipfile.BadZipfile]exception zipfile.BadZipfile`

Исключение, вызываемое для повреждённых ZIP-файлов (старое название:

`zipfile.error`

).

#### `[zipfile.LargeZipFile]exception zipfile.LargeZipFile`

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

#### `[zipfile.ZipFile]class zipfile.ZipFile`

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

[*Объекты ZipFile*](https://python-all.ru/3.0/library/zipfile.html#zipfile-objects)

.

#### `[zipfile.PyZipFile]class zipfile.PyZipFile`

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

#### `[zipfile.ZipInfo]class zipfile.ZipInfo([filename[, date_time]])`

Класс, используемый для представления информации об элементе архива. Экземпляры этого класса возвращаются методами

`getinfo()`

и

`infolist()`

объектов

[`ZipFile`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile)

. Большинству пользователей модуля

`zipfile`

не потребуется создавать их – достаточно использовать те, что созданы этим модулем.

*filename*

должно быть полным именем элемента архива, а

*date\_time*

– кортежем из шести полей, описывающих время последнего изменения файла; поля описаны в разделе

[*ZipInfo Objects*](https://python-all.ru/3.0/library/zipfile.html#zipinfo-objects)

.

#### `[zipfile.is_zipfile]zipfile.is_zipfile(filename)`

Возвращает

`True`

, если

*filename*

является корректным ZIP-файлом на основе его сигнатуры, иначе возвращает

`False`

. Данный модуль в настоящее время не обрабатывает ZIP-файлы с добавленными комментариями.

#### `[zipfile.ZIP_STORED]zipfile.ZIP_STORED`

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

#### `[zipfile.ZIP_DEFLATED]zipfile.ZIP_DEFLATED`

Числовая константа для стандартного метода сжатия ZIP. Для её использования требуется модуль zlib. Другие методы сжатия в настоящее время не поддерживаются.

> **См. также**
>
> **[Примечание по применению PKZIP](https://python-all.ru/3.0/library/zipfile.html)**
>
> Документация по формату ZIP-файлов от Фила Каца, создателя формата и используемых алгоритмов.
>
> **[Домашняя страница Info-ZIP](https://python-all.ru/3.0/library/zipfile.html)**
>
> Информация о программах для работы с ZIP-архивами и библиотеках для разработки проекта Info-ZIP.

## Объекты ZipFile

#### `class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])`

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

```python
cat myzip.zip >> python.exe
```

... тоже работает, и как минимум **WinZip** может читать такие файлы. Если *mode* равен `a` и файл вообще не существует, он создаётся. *compression* – это метод сжатия ZIP, используемый при записи архива; он должен быть [`ZIP_STORED`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZIP_STORED) или [`ZIP_DEFLATED`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZIP_DEFLATED); нераспознанные значения приведут к возникновению [`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError). Если указан [`ZIP_DEFLATED`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZIP_DEFLATED), но модуль [`zlib`](https://python-all.ru/3.0/library/zlib.html#module-zlib) недоступен, также возникает [`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError). Значение по умолчанию – [`ZIP_STORED`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZIP_STORED). Если *allowZip64* равно `True`, zipfile будет создавать ZIP-файлы, использующие расширения ZIP64, когда размер архива превышает 2 ГБ. Если оно равно False (по умолчанию), `zipfile` вызовет исключение, когда ZIP-файлу потребуются расширения ZIP64. Расширения ZIP64 отключены по умолчанию, потому что стандартные команды **zip** и **unzip** в Unix (утилиты InfoZIP) не поддерживают эти расширения.

#### `[zipfile.ZipFile.close]ZipFile.close()`

Закрывает файл архива. Необходимо вызвать

[`close()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.close)

перед выходом из программы, иначе важные записи не будут записаны.

#### `[zipfile.ZipFile.getinfo]ZipFile.getinfo(name)`

Возвращает объект

[`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo)

с информацией об элементе архива

*name*

. Вызов

[`getinfo()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.getinfo)

для имени, отсутствующего в архиве, возбуждает

[`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError)

.

#### `[zipfile.ZipFile.infolist]ZipFile.infolist()`

Возвращает список, содержащий объект

[`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo)

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

#### `[zipfile.ZipFile.namelist]ZipFile.namelist()`

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

#### `[zipfile.ZipFile.open]ZipFile.open(name[, mode[, pwd]])`

Извлекает элемент из архива в виде файлоподобного объекта (ZipExtFile). *name* – это имя файла в архиве или объект [`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo). Параметр *mode*, если указан, должен быть одним из следующих: `'r'` (по умолчанию), `'U'` или `'rU'`. Выбор `'U'` или `'rU'` включает поддержку универсальных символов новой строки в объекте, доступном только для чтения. *pwd* – пароль для зашифрованных файлов. Вызов [`open()`](https://python-all.ru/3.0/library/functions.html#open) для закрытого ZipFile приведёт к возникновению [`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError).

> **Примечание**
>
> Объект, подобный файлу, доступен только для чтения и предоставляет следующие методы: [`read()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.read), `readline()`, `readlines()`, [`__iter__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__iter__), [`next()`](https://python-all.ru/3.0/library/functions.html#next).

> **Примечание**
>
> Если ZipFile был создан путём передачи файлоподобного объекта в качестве первого аргумента конструктора, то объект, возвращаемый [`open()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.open), разделяет файловый указатель ZipFile. В таких условиях объект, возвращаемый [`open()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.open), не следует использовать после выполнения любых дополнительных операций над объектом ZipFile. Если ZipFile был создан путём передачи строки (имени файла) в качестве первого аргумента конструктора, то [`open()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.open) создаст новый файловый объект, который будет удерживаться ZipExtFile, что позволяет ему работать независимо от ZipFile.

> **Примечание**
>
> Методы [`open()`](https://python-all.ru/3.0/library/functions.html#open), [`read()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.read) и [`extract()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.extract) могут принимать имя файла или объект [`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo). Это пригодится при попытке прочитать ZIP-файл, содержащий элементы с повторяющимися именами.

#### `[zipfile.ZipFile.extract]ZipFile.extract(member[, path[, pwd]])`

Извлекает элемент из архива в текущий рабочий каталог;

*member*

должно быть его полным именем или объектом

[`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo)

). Информация о файле извлекается максимально точно.

*path*

задаёт другой каталог для извлечения.

*member*

может быть именем файла или объектом

[`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo)

.

*pwd*

– это пароль для зашифрованных файлов.

#### `[zipfile.ZipFile.extractall]ZipFile.extractall([path[, members[, pwd]]])`

Извлекает все элементы из архива в текущий рабочий каталог.

*path*

задаёт другой каталог для извлечения.

*members*

является необязательным и должен быть подмножеством списка, возвращаемого

[`namelist()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.namelist)

.

*pwd*

– это пароль для зашифрованных файлов.

#### `[zipfile.ZipFile.printdir]ZipFile.printdir()`

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

`sys.stdout`

.

#### `[zipfile.ZipFile.setpassword]ZipFile.setpassword(pwd)`

Устанавливает

*pwd*

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

#### `[zipfile.ZipFile.read]ZipFile.read(name[, pwd])`

Возвращает байты файла

*name*

в архиве.

*name*

– это имя файла в архиве или объект

[`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo)

. Архив должен быть открыт для чтения или добавления.

*pwd*

– пароль, используемый для зашифрованных файлов; если указан, он переопределяет пароль по умолчанию, заданный с помощью

[`setpassword()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.setpassword)

. Вызов

[`read()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.read)

на закрытом ZipFile приведёт к возникновению

[`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError)

.

#### `[zipfile.ZipFile.testzip]ZipFile.testzip()`

Читает все файлы в архиве и проверяет их CRC и заголовки файлов. Возвращает имя первого повреждённого файла или

`None`

, если все файлы в порядке. Вызов

[`testzip()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.testzip)

на закрытом ZipFile вызовет

[`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError)

.

#### `[zipfile.ZipFile.write]ZipFile.write(filename[, arcname[, compress_type]])`

Записывает файл с именем *filename* в архив, присваивая ему имя в архиве *arcname* (по умолчанию оно будет таким же, как *filename*, но без буквы диска и с удалёнными начальными разделителями пути). Если указан, *compress\_type* переопределяет значение, заданное для параметра *compression* конструктора для новой записи. Архив должен быть открыт в режиме `'w'` или `'a'` – вызов [`write()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.write) на ZipFile, созданном в режиме `'r'`, вызовет [`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError). Вызов [`write()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.write) на закрытом ZipFile вызовет [`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError).

> **Примечание**
>
> Официальной кодировки имён файлов для ZIP-файлов не существует. Если используются имена файлов в Unicode, необходимо преобразовать их в байтовые строки в нужной кодировке перед передачей в [`write()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.write). WinZip интерпретирует все имена файлов как закодированные в CP437, также известной как DOS Latin.

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

> **Примечание**
>
> Если `arcname` (или `filename`, если `arcname` не указан) содержит нулевой байт, имя файла в архиве будет обрезано по нулевому байту.

#### `[zipfile.ZipFile.writestr]ZipFile.writestr(zinfo_or_arcname, bytes)`

Записывает строку *bytes* в архив; *zinfo\_or\_arcname* – это либо имя файла, которое будет присвоено в архиве, либо экземпляр [`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo). Если это экземпляр, необходимо указать как минимум имя файла, дату и время. Если это имя, дата и время устанавливаются на текущие. Архив должен быть открыт в режиме `'w'` или `'a'` – вызов [`writestr()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.writestr) на ZipFile, созданном в режиме `'r'`, вызовет [`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError). Вызов [`writestr()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.writestr) на закрытом ZipFile вызовет [`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError).

> **Примечание**
>
> При передаче экземпляра [`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo) в качестве параметра *zinfo\_or\_acrname* используемый метод сжатия будет тем, который указан в поле *compress\_type* данного экземпляра [`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo). По умолчанию конструктор [`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo) устанавливает этому полю значение [`ZIP_STORED`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZIP_STORED).

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

#### `[zipfile.ZipFile.debug]ZipFile.debug`

Уровень отладочного вывода. Может быть установлен от

`0`

(по умолчанию, без вывода) до

`3`

(максимальный вывод). Отладочная информация записывается в

`sys.stdout`

.

#### `[zipfile.ZipFile.comment]ZipFile.comment`

Текст комментария, связанного с ZIP-файлом. При назначении комментария экземпляру

[`ZipFile`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile)

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

[`ZipFile.close()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.close)

.

## Объекты PyZipFile

Конструктор [`PyZipFile`](https://python-all.ru/3.0/library/zipfile.html#zipfile.PyZipFile) принимает те же параметры, что и конструктор [`ZipFile`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile). Экземпляры имеют один дополнительный метод по сравнению с объектами [`ZipFile`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile).

#### `[zipfile.PyZipFile.writepy]PyZipFile.writepy(pathname[, basename])`

Search for files `*.py` and add the corresponding file to the archive. The corresponding file is a `*.pyo` file if available, else a `*.pyc` file, compiling if necessary. If the pathname is a file, the filename must end with `.py`, and just the (corresponding `*.py[co]`) file is added at the top level (no path information). If the pathname is a file that does not end with `.py`, a [`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError) will be raised. If it is a directory, and the directory is not a package directory, then all the files `*.py[co]` are added at the top level. If the directory is a package directory, then all `*.py[co]` are added under the package name as a file path, and if any subdirectories are package directories, all of these are added recursively. *basename* is intended for internal use only. The [`writepy()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.PyZipFile.writepy) method makes archives with file names like this:

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

## Объекты ZipInfo

Экземпляры класса [`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo) возвращаются методами `getinfo()` и `infolist()` объектов [`ZipFile`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile). Каждый объект хранит информацию об одном элементе ZIP-архива.

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

#### `[zipfile.ZipInfo.filename]ZipInfo.filename`

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

#### `[zipfile.ZipInfo.date_time]ZipInfo.date_time`

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

| Индекс | Значение |
| --- | --- |
| `0` | Год |
| `1` | Месяц (начиная с 1) |
| `2` | День месяца (начиная с 1) |
| `3` | Часы (начиная с 0) |
| `4` | Минуты (начиная с 0) |
| `5` | Секунды (начиная с 0) |

#### `[zipfile.ZipInfo.compress_type]ZipInfo.compress_type`

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

#### `[zipfile.ZipInfo.comment]ZipInfo.comment`

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

#### `[zipfile.ZipInfo.extra]ZipInfo.extra`

Данные поля расширения. В

[Примечании к приложению PKZIP](https://python-all.ru/3.0/library/zipfile.html)

содержатся комментарии о внутренней структуре данных, содержащихся в этой строке.

#### `[zipfile.ZipInfo.create_system]ZipInfo.create_system`

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

#### `[zipfile.ZipInfo.create_version]ZipInfo.create_version`

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

#### `[zipfile.ZipInfo.extract_version]ZipInfo.extract_version`

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

#### `[zipfile.ZipInfo.reserved]ZipInfo.reserved`

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

#### `[zipfile.ZipInfo.flag_bits]ZipInfo.flag_bits`

Биты флагов ZIP.

#### `[zipfile.ZipInfo.volume]ZipInfo.volume`

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

#### `[zipfile.ZipInfo.internal_attr]ZipInfo.internal_attr`

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

#### `[zipfile.ZipInfo.external_attr]ZipInfo.external_attr`

Внешние атрибуты файла.

#### `[zipfile.ZipInfo.header_offset]ZipInfo.header_offset`

Смещение в байтах до заголовка файла.

#### `[zipfile.ZipInfo.CRC]ZipInfo.CRC`

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

#### `[zipfile.ZipInfo.compress_size]ZipInfo.compress_size`

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

#### `[zipfile.ZipInfo.file_size]ZipInfo.file_size`

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