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

zipfile.md

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

1> **Источник:** https://python-all.ru/3.5/library/zipfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 13.5. [`zipfile`](https://python-all.ru/3.5/library/zipfile.html#module-zipfile) – Работа с ZIP-архивами89**Исходный код:** [Lib/zipfile.py](https://python-all.ru/src/3.5/Lib/zipfile.py)1011---1213Формат ZIP – распространённый стандарт архивации и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и просмотра содержимого ZIP-файлов. Любое продвинутое использование модуля требует понимания формата, описанного в [PKZIP Application Note](https://python-all.ru/3.5/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.5/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.5/library/zipfile.html#zipfile-objects).3839#### `class zipfile.PyZipFile`4041Класс для создания ZIP-архивов, содержащих библиотеки Python.4243#### `class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))`4445Класс для представления информации об элементе архива. Экземпляры этого класса возвращаются методами [`getinfo()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.getinfo) и [`infolist()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.infolist) объектов [`ZipFile`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile). Большинству пользователей модуля [`zipfile`](https://python-all.ru/3.5/library/zipfile.html#module-zipfile) не потребуется создавать их самостоятельно – достаточно использовать те, что созданы этим модулем. *filename* должен содержать полное имя элемента архива, а *date\_time* – кортеж из шести полей, описывающих время последнего изменения файла. Описание полей приведено в разделе [Объекты ZipInfo](https://python-all.ru/3.5/library/zipfile.html#zipinfo-objects).4647#### `zipfile.is_zipfile(filename)`4849Возвращает `True`, если *filename* является корректным ZIP-файлом (проверка по магическому числу), иначе возвращает `False`. *filename* может быть файлом или файлоподобным объектом.5051Изменено в версии 3.1: Добавлена поддержка файлов и файлоподобных объектов.5253#### `zipfile.ZIP_STORED`5455Числовая константа для несжатого элемента архива.5657#### `zipfile.ZIP_DEFLATED`5859Числовая константа для стандартного метода сжатия ZIP. Требует модуль [`zlib`](https://python-all.ru/3.5/library/zlib.html#module-zlib).6061#### `zipfile.ZIP_BZIP2`6263Числовая константа для метода сжатия BZIP2. Для этого требуется модуль [`bz2`](https://python-all.ru/3.5/library/bz2.html#module-bz2).6465Новое в версии 3.3.6667#### `zipfile.ZIP_LZMA`6869Числовая константа для метода сжатия LZMA. Для этого требуется модуль [`lzma`](https://python-all.ru/3.5/library/lzma.html#module-lzma).7071Новое в версии 3.3.7273> **Примечание**74>75> Спецификация формата ZIP поддерживает сжатие bzip2 с 2001 года и сжатие LZMA с 2006 года. Однако некоторые инструменты (включая старые версии Python) не поддерживают эти методы сжатия и могут либо полностью отказаться обрабатывать ZIP-файл, либо не извлечь отдельные файлы.7677> **См. также**78>79> **[Примечание по применению PKZIP](https://python-all.ru/3.5/library/zipfile.html)**80>81> Документация по формату ZIP-файлов от Фила Каца, создателя формата и используемых алгоритмов.82>83> **[Домашняя страница Info-ZIP](https://python-all.ru/3.5/library/zipfile.html)**84>85> Информация о программах для работы с ZIP-архивами и библиотеках для разработки проекта Info-ZIP.8687## 13.5.1. Объекты ZipFile8889#### `class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True)`9091Открывает ZIP-файл, где *file* может быть либо путём к файлу (строка), либо объектом, подобным файлу. Параметр *mode* должен быть `'r'` для чтения существующего файла, `'w'` для усечения и записи нового файла, `'a'` для добавления к существующему файлу или `'x'` для исключительного создания и записи нового файла. Если *mode* равен `'x'`, а *file* ссылается на существующий файл, будет возбуждено [`FileExistsError`](https://python-all.ru/3.5/library/exceptions.html#FileExistsError). Если *mode* равен `'a'` и *file* ссылается на существующий ZIP-файл, то в него добавляются новые файлы. Если *file* не ссылается на ZIP-файл, то новый ZIP-архив добавляется в конец файла. Это предназначено для добавления ZIP-архива в другой файл (например, `python.exe`). Если *mode* равен `'a'` и файл вообще не существует, он создаётся. Если *mode* равен `'r'` или `'a'`, файл должен поддерживать позиционирование. *compression* – метод сжатия ZIP, используемый при записи архива; должен быть [`ZIP_STORED`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_STORED), [`ZIP_DEFLATED`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_DEFLATED), [`ZIP_BZIP2`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_BZIP2) или [`ZIP_LZMA`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_LZMA); нераспознанные значения вызовут возбуждение [`RuntimeError`](https://python-all.ru/3.5/library/exceptions.html#RuntimeError). Если указан [`ZIP_DEFLATED`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_DEFLATED), [`ZIP_BZIP2`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_BZIP2) или [`ZIP_LZMA`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_LZMA), но соответствующий модуль ([`zlib`](https://python-all.ru/3.5/library/zlib.html#module-zlib), [`bz2`](https://python-all.ru/3.5/library/bz2.html#module-bz2) или [`lzma`](https://python-all.ru/3.5/library/lzma.html#module-lzma)) недоступен, также возбуждается [`RuntimeError`](https://python-all.ru/3.5/library/exceptions.html#RuntimeError). По умолчанию используется [`ZIP_STORED`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_STORED). Если *allowZip64* равен `True` (по умолчанию), zipfile будет создавать ZIP-файлы, использующие расширения ZIP64, когда размер zip-файла превышает 4 ГиБ. Если он ложен [`zipfile`](https://python-all.ru/3.5/library/zipfile.html#module-zipfile), при необходимости расширений ZIP64 будет возбуждено исключение.9293Если файл создан с режимом `'w'`, `'x'` или `'a'`, а затем [`closed`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.close) без добавления каких-либо файлов в архив, в файл будут записаны соответствующие структуры ZIP для пустого архива.9495ZipFile также является контекстным менеджером и поэтому поддерживает оператор [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with). В примере *myzip* закрывается после завершения блока оператора [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with) – даже если возникло исключение:9697```python98with ZipFile('spam.zip', 'w') as myzip:99    myzip.write('eggs.txt')100```101102Новое в версии 3.2: Добавлена возможность использовать [`ZipFile`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile) в качестве менеджера контекста.103104Изменено в версии 3.3: Добавлена поддержка сжатия [`bzip2`](https://python-all.ru/3.5/library/bz2.html#module-bz2) и [`lzma`](https://python-all.ru/3.5/library/lzma.html#module-lzma).105106Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.107108Изменено в версии 3.5: Добавлена поддержка записи в непозиционируемые потоки. Добавлена поддержка режима `'x'`.109110#### `ZipFile.close()`111112Закрывает файл архива. Перед выходом из программы необходимо вызвать [`close()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.close), иначе важные записи не будут записаны.113114#### `ZipFile.getinfo(name)`115116Возвращает объект [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo) с информацией об элементе архива *name*. Вызов [`getinfo()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.getinfo) для имени, отсутствующего в архиве, приведёт к возникновению исключения [`KeyError`](https://python-all.ru/3.5/library/exceptions.html#KeyError).117118#### `ZipFile.infolist()`119120Возвращает список, содержащий объект [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo) для каждого элемента архива. Объекты расположены в том же порядке, что и их записи в реальном ZIP-файле на диске, если был открыт существующий архив.121122#### `ZipFile.namelist()`123124Возвращает список элементов архива по именам.125126#### `ZipFile.open(name, mode='r', pwd=None)`127128Извлекает элемент из архива в виде объекта, подобного файлу (ZipExtFile). *name* – имя файла в архиве или объект [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo). Параметр *mode*, если указан, должен быть одним из следующих: `'r'` (по умолчанию), `'U'` или `'rU'`. Выбор `'U'` или `'rU'` включает поддержку [универсальных символов новой строки](https://python-all.ru/3.5/glossary.html#term-universal-newlines) в объекте, доступном только для чтения. *pwd* – пароль для зашифрованных файлов. Вызов [`open()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.open) для закрытого ZipFile возбудит [`RuntimeError`](https://python-all.ru/3.5/library/exceptions.html#RuntimeError).129130[`open()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.open) также является контекстным менеджером и поэтому поддерживает оператор [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with):131132```python133with ZipFile('spam.zip') as myzip:134    with myzip.open('eggs.txt') as myfile:135        print(myfile.read())136```137138> **Примечание**139>140> Объект, подобный файлу, доступен только для чтения и предоставляет следующие методы: [`read()`](https://python-all.ru/3.5/library/io.html#io.BufferedIOBase.read), [`readline()`](https://python-all.ru/3.5/library/io.html#io.IOBase.readline), [`readlines()`](https://python-all.ru/3.5/library/io.html#io.IOBase.readlines), [`__iter__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__iter__), [`__next__()`](https://python-all.ru/3.5/library/stdtypes.html#iterator.__next__).141142> **Примечание**143>144> Объекты, возвращаемые [`open()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.open), могут работать независимо от ZipFile.145146> **Примечание**147>148> Методы [`open()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.open), [`read()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.read) и [`extract()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.extract) могут принимать имя файла или объект [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo). Это пригодится при попытке чтения ZIP-файла, содержащего элементы с повторяющимися именами.149150Устарело с версии 3.4, будет удалено в версии 3.6: Режим `'U'` или `'rU'`. Используйте [`io.TextIOWrapper`](https://python-all.ru/3.5/library/io.html#io.TextIOWrapper) для чтения сжатых текстовых файлов в режиме [универсальных символов новой строки](https://python-all.ru/3.5/glossary.html#term-universal-newlines).151152#### `ZipFile.extract(member, path=None, pwd=None)`153154Извлекает элемент из архива в текущую рабочую директорию. *member* должно быть полным именем файла или объектом [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo). Информация о файле извлекается максимально точно. *path* задаёт другую директорию для извлечения. *member* может быть именем файла или объектом [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo). *pwd* – пароль для зашифрованных файлов.155156Возвращает нормализованный путь (каталог или новый файл).157158> **Примечание**159>160> Если имя файла элемента является абсолютным путём, диск/UNC-точка и начальные (обратные) слеши будут удалены, например: `///foo/bar` становится `foo/bar` на Unix, а `C:\foo\bar` становится `foo\bar` на Windows. Все компоненты `".."` в имени файла элемента будут удалены, например: `../../foo../../ba..r` становится `foo../ba..r`. На Windows недопустимые символы (`:`, `<`, `>`, `|`, `"`, `?` и `*`) заменяются подчёркиванием (`_`).161162#### `ZipFile.extractall(path=None, members=None, pwd=None)`163164Извлекает все элементы из архива в текущую рабочую директорию. *path* задаёт другую директорию для извлечения. *members* – необязательный параметр, должен быть подмножеством списка, возвращаемого [`namelist()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.namelist). *pwd* – пароль для зашифрованных файлов.165166> **Предупреждение**167>168> Никогда не извлекайте архивы из ненадёжных источников без предварительной проверки. Существует вероятность создания файлов за пределами *path*, например, элементы с абсолютными именами файлов, начинающимися с `"/"`, или имена файлов с двумя точками `".."`. Модуль пытается предотвратить это. См. примечание [`extract()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.extract).169170#### `ZipFile.printdir()`171172Выводит оглавление архива в `sys.stdout`.173174#### `ZipFile.setpassword(pwd)`175176Устанавливает *pwd* в качестве пароля по умолчанию для извлечения зашифрованных файлов.177178#### `ZipFile.read(name, pwd=None)`179180Возвращает байты файла *name* в архиве. *name* – имя файла в архиве или объект [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo). Архив должен быть открыт для чтения или добавления. *pwd* – пароль для зашифрованных файлов; если указан, он переопределяет пароль по умолчанию, заданный с помощью [`setpassword()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.setpassword). Вызов [`read()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.read) для закрытого ZipFile возбудит [`RuntimeError`](https://python-all.ru/3.5/library/exceptions.html#RuntimeError). Вызов [`read()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.read) для ZipFile, использующего метод сжатия, отличный от [`ZIP_STORED`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_STORED), [`ZIP_DEFLATED`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_DEFLATED), [`ZIP_BZIP2`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_BZIP2) или [`ZIP_LZMA`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_LZMA), возбудит [`NotImplementedError`](https://python-all.ru/3.5/library/exceptions.html#NotImplementedError). Ошибка также будет возбуждена, если соответствующий модуль сжатия недоступен.181182#### `ZipFile.testzip()`183184Читает все файлы в архиве и проверяет их CRC и заголовки файлов. Возвращает имя первого повреждённого файла или `None`. Вызов [`testzip()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.testzip) для закрытого ZipFile возбудит [`RuntimeError`](https://python-all.ru/3.5/library/exceptions.html#RuntimeError).185186#### `ZipFile.write(filename, arcname=None, compress_type=None)`187188Записывает файл с именем *filename* в архив, присваивая ему архивное имя *arcname* (по умолчанию оно совпадает с *filename*, но без буквы диска и с удалёнными начальными разделителями пути). Если указан, *compress\_type* переопределяет значение, заданное для параметра *compression* конструктора для новой записи. Архив должен быть открыт в режиме `'w'`, `'x'` или `'a'` – вызов [`write()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.write) для ZipFile, созданного с режимом `'r'`, возбудит [`RuntimeError`](https://python-all.ru/3.5/library/exceptions.html#RuntimeError). Вызов [`write()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.write) для закрытого ZipFile возбудит [`RuntimeError`](https://python-all.ru/3.5/library/exceptions.html#RuntimeError).189190> **Примечание**191>192> Для ZIP-файлов не существует официальной кодировки имён файлов. Если у вас есть имена файлов в Юникоде, вы должны преобразовать их в байтовые строки в нужной кодировке перед передачей в [`write()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.write). WinZip интерпретирует все имена файлов как закодированные в CP437, также известной как DOS Latin.193194> **Примечание**195>196> Архивные имена должны быть относительными по отношению к корню архива, то есть не должны начинаться с разделителя пути.197198> **Примечание**199>200> Если `arcname` (или `filename`, если `arcname` не указан) содержит нулевой байт, имя файла в архиве будет обрезано по этому байту.201202#### `ZipFile.writestr(zinfo_or_arcname, data[, compress_type])`203204Записывает строку *data* в архив; *zinfo\_or\_arcname* – это либо имя файла, которое он получит в архиве, либо экземпляр [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo). Если это экземпляр, должны быть указаны как минимум имя файла, дата и время. Если это имя, дата и время устанавливаются равными текущим. Архив должен быть открыт в режиме `'w'`, `'x'` или `'a'` – вызов [`writestr()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.writestr) для ZipFile, созданного с режимом `'r'`, возбудит [`RuntimeError`](https://python-all.ru/3.5/library/exceptions.html#RuntimeError). Вызов [`writestr()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.writestr) для закрытого ZipFile возбудит [`RuntimeError`](https://python-all.ru/3.5/library/exceptions.html#RuntimeError).205206Если указан, *compress\_type* переопределяет значение, заданное для параметра *compression* в конструкторе для новой записи, или в *zinfo\_or\_arcname* (если это экземпляр [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo)).207208> **Примечание**209>210> При передаче экземпляра [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo) в качестве параметра *zinfo\_or\_arcname* используемый метод сжатия будет тем, который указан в элементе *compress\_type* данного экземпляра [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo). По умолчанию конструктор [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo) устанавливает этот элемент в [`ZIP_STORED`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZIP_STORED).211212Изменено в версии 3.2: Аргумент *compress\_type*.213214Также доступны следующие атрибуты данных:215216#### `ZipFile.debug`217218Уровень отладочного вывода. Может быть установлен от `0` (по умолчанию, без вывода) до `3` (максимальный вывод). Отладочная информация записывается в `sys.stdout`.219220#### `ZipFile.comment`221222Текст комментария, связанный с ZIP-файлом. Если присвоить комментарий экземпляру [`ZipFile`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile), созданному с режимом `'w'`, `'x'` или `'a'`, это должна быть строка длиной не более 65535 байт. Более длинные комментарии будут усечены в записанном архиве при вызове [`close()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.close).223224## 13.5.2. Объекты PyZipFile225226Конструктор [`PyZipFile`](https://python-all.ru/3.5/library/zipfile.html#zipfile.PyZipFile) принимает те же параметры, что и конструктор [`ZipFile`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile), плюс один дополнительный параметр *optimize*.227228#### `class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)`229230Новое в версии 3.2: Параметр *optimize*.231232Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.233234Экземпляры имеют один метод в дополнение к методам [`ZipFile`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile) объектов:235236#### `writepy(pathname, basename='', filterfunc=None)`237238Ищет файлы `*.py` и добавляет соответствующий файл в архив.239240Если параметру *optimize* в [`PyZipFile`](https://python-all.ru/3.5/library/zipfile.html#zipfile.PyZipFile) не было задано значение или он равен `-1`, то соответствующим файлом является `*.pyc` файл, при необходимости компилируемый.241242Если параметру *optimize* в [`PyZipFile`](https://python-all.ru/3.5/library/zipfile.html#zipfile.PyZipFile) было задано значение `0`, `1` или `2`, в архив добавляются только файлы с таким уровнем оптимизации (см. [`compile()`](https://python-all.ru/3.5/library/functions.html#compile)), при необходимости компилируемые.243244Если *pathname* – это файл, его имя должно заканчиваться на `.py`, и (соответствующий файл `*.pyc`) добавляется на верхний уровень (без информации о пути). Если *pathname* – это файл, не заканчивающийся на `.py`, будет возбуждено исключение [`RuntimeError`](https://python-all.ru/3.5/library/exceptions.html#RuntimeError). Если это каталог, и каталог не является каталогом пакета, все файлы `*.pyc` добавляются на верхний уровень. Если каталог является каталогом пакета, то все `*.pyc` добавляются под именем пакета в качестве файлового пути, а если какие-либо подкаталоги являются каталогами пакетов, все они добавляются рекурсивно.245246*basename* предназначен только для внутреннего использования.247248*filterfunc*, если задан, должен быть функцией, принимающей один строковый аргумент. Ей будет передаваться каждый путь (включая каждый полный путь к файлу) перед добавлением в архив. Если *filterfunc* возвращает ложное значение, путь не будет добавлен, а если это каталог, его содержимое будет проигнорировано. Например, если все наши тестовые файлы находятся в каталогах `test` или начинаются со строки `test_`, мы можем использовать *filterfunc* для их исключения:249250```python251>>> zf = PyZipFile('myprog.zip')252>>> def notests(s):253...     fn = os.path.basename(s)254...     return (not (fn == 'test' or fn.startswith('test_')))255>>> zf.writepy('myprog', filterfunc=notests)256```257258Метод [`writepy()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.PyZipFile.writepy) создаёт архивы с именами файлов следующего вида:259260```python261string.pyc                   # Имя верхнего уровня262test/__init__.pyc            # Каталог пакета263test/testall.pyc             # Модуль test.testall264test/bogus/__init__.pyc      # Каталог подпакета265test/bogus/myfile.pyc        # Подмодуль test.bogus.myfile266```267268Новое в версии 3.4: Параметр *filterfunc*.269270## 13.5.3. Объекты ZipInfo271272Экземпляры класса [`ZipInfo`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipInfo) возвращаются методами [`getinfo()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.getinfo) и [`infolist()`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile.infolist) объектов [`ZipFile`](https://python-all.ru/3.5/library/zipfile.html#zipfile.ZipFile). Каждый объект хранит информацию об одном элементе ZIP-архива.273274Экземпляры имеют следующие атрибуты:275276#### `ZipInfo.filename`277278Имя файла в архиве.279280#### `ZipInfo.date_time`281282Время и дата последнего изменения элемента архива. Это кортеж из шести значений:283284| Индекс | Значение |285| --- | --- |286| `0` | Год (\>= 1980) |287| `1` | Месяц (начиная с 1) |288| `2` | День месяца (начиная с 1) |289| `3` | Часы (начиная с 0) |290| `4` | Минуты (начиная с 0) |291| `5` | Секунды (начиная с 0) |292293> **Примечание**294>295> Формат ZIP-файлов не поддерживает метки времени до 1980 года.296297#### `ZipInfo.compress_type`298299Тип сжатия для элемента архива.300301#### `ZipInfo.comment`302303Комментарий для отдельного элемента архива.304305#### `ZipInfo.extra`306307Данные поля расширения. В [Примечании к приложению PKZIP](https://python-all.ru/3.5/library/zipfile.html) содержатся комментарии о внутренней структуре данных, содержащихся в этой строке.308309#### `ZipInfo.create_system`310311Система, создавшая ZIP-архив.312313#### `ZipInfo.create_version`314315Версия PKZIP, создавшая ZIP-архив.316317#### `ZipInfo.extract_version`318319Версия PKZIP, необходимая для извлечения архива.320321#### `ZipInfo.reserved`322323Должно быть равно нулю.324325#### `ZipInfo.flag_bits`326327Биты флагов ZIP.328329#### `ZipInfo.volume`330331Номер тома заголовка файла.332333#### `ZipInfo.internal_attr`334335Внутренние атрибуты.336337#### `ZipInfo.external_attr`338339Внешние атрибуты файла.340341#### `ZipInfo.header_offset`342343Смещение в байтах до заголовка файла.344345#### `ZipInfo.CRC`346347CRC-32 несжатого файла.348349#### `ZipInfo.compress_size`350351Размер сжатых данных.352353#### `ZipInfo.file_size`354355Размер несжатого файла.356357## 13.5.4. Интерфейс командной строки358359Модуль [`zipfile`](https://python-all.ru/3.5/library/zipfile.html#module-zipfile) предоставляет простой интерфейс командной строки для работы с ZIP-архивами.360361Чтобы создать новый ZIP-архив, укажите его имя после параметра [`-c`](https://python-all.ru/3.5/library/zipfile.html#cmdoption-zipfile-c) и перечислите имена файлов, которые нужно включить:362363```console364$ python -m zipfile -c monty.zip spam.txt eggs.txt365```366367Можно также передать каталог:368369```console370$ python -m zipfile -c monty.zip life-of-brian_1979/371```372373Чтобы извлечь ZIP-архив в указанный каталог, используйте параметр [`-e`](https://python-all.ru/3.5/library/zipfile.html#cmdoption-zipfile-e):374375```console376$ python -m zipfile -e monty.zip target-dir/377```378379Для получения списка файлов в ZIP-архиве используйте параметр [`-l`](https://python-all.ru/3.5/library/zipfile.html#cmdoption-zipfile-l):380381```console382$ python -m zipfile -l monty.zip383```384385### 13.5.4.1. Параметры командной строки386387#### `-l <zipfile>`388389Выводит список файлов в ZIP-архиве.390391#### `-c <zipfile> <source1> ... <sourceN>`392393Создать zip-файл из исходных файлов.394395#### `-e <zipfile> <output_dir>`396397Извлечь zip-файл в целевой каталог.398399#### `-t <zipfile>`400401Проверить, корректен ли zip-файл.402