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

zipfile.md

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

1> **Источник:** https://python-all.ru/3.0/library/zipfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `zipfile` – Работа с ZIP-архивами89Формат ZIP – распространённый стандарт архивации и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и просмотра содержимого ZIP-файлов. Любое продвинутое использование модуля требует понимания формата, описанного в [PKZIP Application Note](https://python-all.ru/3.0/library/zipfile.html).1011Этот модуль в настоящее время не поддерживает многодисковые ZIP-файлы или ZIP-файлы с добавленными комментариями (хотя он корректно обрабатывает комментарии, добавленные к отдельным элементам архива – см. документацию [*ZipInfo Objects*](https://python-all.ru/3.0/library/zipfile.html#zipinfo-objects)). Он может обрабатывать ZIP-файлы, использующие расширения ZIP64 (то есть ZIP-файлы размером более 4 Гбайт). Поддерживается расшифровка зашифрованных файлов в ZIP-архивах, но создать зашифрованный файл в настоящее время невозможно. Расшифровка выполняется крайне медленно, так как реализована на чистом Python, а не на C.1213О других форматах архивов см. модули [`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).1415Модуль определяет следующие элементы:1617#### `[zipfile.BadZipfile]exception zipfile.BadZipfile`1819Исключение, вызываемое для повреждённых ZIP-файлов (старое название:2021`zipfile.error`2223).2425#### `[zipfile.LargeZipFile]exception zipfile.LargeZipFile`2627Исключение, возникающее, когда ZIP-файлу требуется функциональность ZIP64, но она не включена.2829#### `[zipfile.ZipFile]class zipfile.ZipFile`3031Класс для чтения и записи ZIP-файлов. Подробнее о конструкторе см. раздел3233[*Объекты ZipFile*](https://python-all.ru/3.0/library/zipfile.html#zipfile-objects)3435.3637#### `[zipfile.PyZipFile]class zipfile.PyZipFile`3839Класс для создания ZIP-архивов, содержащих библиотеки Python.4041#### `[zipfile.ZipInfo]class zipfile.ZipInfo([filename[, date_time]])`4243Класс, используемый для представления информации об элементе архива. Экземпляры этого класса возвращаются методами4445`getinfo()`4647и4849`infolist()`5051объектов5253[`ZipFile`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile)5455. Большинству пользователей модуля5657`zipfile`5859не потребуется создавать их – достаточно использовать те, что созданы этим модулем.6061*filename*6263должно быть полным именем элемента архива, а6465*date\_time*6667– кортежем из шести полей, описывающих время последнего изменения файла; поля описаны в разделе6869[*ZipInfo Objects*](https://python-all.ru/3.0/library/zipfile.html#zipinfo-objects)7071.7273#### `[zipfile.is_zipfile]zipfile.is_zipfile(filename)`7475Возвращает7677`True`7879, если8081*filename*8283является корректным ZIP-файлом на основе его сигнатуры, иначе возвращает8485`False`8687. Данный модуль в настоящее время не обрабатывает ZIP-файлы с добавленными комментариями.8889#### `[zipfile.ZIP_STORED]zipfile.ZIP_STORED`9091Числовая константа для несжатого элемента архива.9293#### `[zipfile.ZIP_DEFLATED]zipfile.ZIP_DEFLATED`9495Числовая константа для стандартного метода сжатия ZIP. Для её использования требуется модуль zlib. Другие методы сжатия в настоящее время не поддерживаются.9697> **См. также**98>99> **[Примечание по применению PKZIP](https://python-all.ru/3.0/library/zipfile.html)**100>101> Документация по формату ZIP-файлов от Фила Каца, создателя формата и используемых алгоритмов.102>103> **[Домашняя страница Info-ZIP](https://python-all.ru/3.0/library/zipfile.html)**104>105> Информация о программах для работы с ZIP-архивами и библиотеках для разработки проекта Info-ZIP.106107## Объекты ZipFile108109#### `class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])`110111Открывает ZIP-файл. *file* может быть путём к файлу (строка) или объектом, похожим на файл. Параметр *mode* должен быть равен `'r'` для чтения существующего файла, `'w'` для усечения и записи нового файла, или `'a'` для добавления к существующему файлу. Если *mode* равен `'a'` и *file* ссылается на существующий ZIP-файл, то в него добавляются дополнительные файлы. Если *file* не ссылается на ZIP-файл, то к файлу добавляется новый ZIP-архив. Это предназначено для встраивания ZIP-архива в другой файл, например `python.exe`. Использование112113```python114cat myzip.zip >> python.exe115```116117... тоже работает, и как минимум **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) не поддерживают эти расширения.118119#### `[zipfile.ZipFile.close]ZipFile.close()`120121Закрывает файл архива. Необходимо вызвать122123[`close()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.close)124125перед выходом из программы, иначе важные записи не будут записаны.126127#### `[zipfile.ZipFile.getinfo]ZipFile.getinfo(name)`128129Возвращает объект130131[`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo)132133с информацией об элементе архива134135*name*136137. Вызов138139[`getinfo()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.getinfo)140141для имени, отсутствующего в архиве, возбуждает142143[`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError)144145.146147#### `[zipfile.ZipFile.infolist]ZipFile.infolist()`148149Возвращает список, содержащий объект150151[`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo)152153для каждого элемента архива. Объекты расположены в том же порядке, что и соответствующие записи в реальном ZIP- файле на диске (если был открыт существующий архив).154155#### `[zipfile.ZipFile.namelist]ZipFile.namelist()`156157Возвращает список элементов архива по именам.158159#### `[zipfile.ZipFile.open]ZipFile.open(name[, mode[, pwd]])`160161Извлекает элемент из архива в виде файлоподобного объекта (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).162163> **Примечание**164>165> Объект, подобный файлу, доступен только для чтения и предоставляет следующие методы: [`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).166167> **Примечание**168>169> Если 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.170171> **Примечание**172>173> Методы [`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-файл, содержащий элементы с повторяющимися именами.174175#### `[zipfile.ZipFile.extract]ZipFile.extract(member[, path[, pwd]])`176177Извлекает элемент из архива в текущий рабочий каталог;178179*member*180181должно быть его полным именем или объектом182183[`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo)184185). Информация о файле извлекается максимально точно.186187*path*188189задаёт другой каталог для извлечения.190191*member*192193может быть именем файла или объектом194195[`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo)196197.198199*pwd*200201– это пароль для зашифрованных файлов.202203#### `[zipfile.ZipFile.extractall]ZipFile.extractall([path[, members[, pwd]]])`204205Извлекает все элементы из архива в текущий рабочий каталог.206207*path*208209задаёт другой каталог для извлечения.210211*members*212213является необязательным и должен быть подмножеством списка, возвращаемого214215[`namelist()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.namelist)216217.218219*pwd*220221– это пароль для зашифрованных файлов.222223#### `[zipfile.ZipFile.printdir]ZipFile.printdir()`224225Выводит оглавление архива в226227`sys.stdout`228229.230231#### `[zipfile.ZipFile.setpassword]ZipFile.setpassword(pwd)`232233Устанавливает234235*pwd*236237в качестве пароля по умолчанию для извлечения зашифрованных файлов.238239#### `[zipfile.ZipFile.read]ZipFile.read(name[, pwd])`240241Возвращает байты файла242243*name*244245в архиве.246247*name*248249– это имя файла в архиве или объект250251[`ZipInfo`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipInfo)252253. Архив должен быть открыт для чтения или добавления.254255*pwd*256257– пароль, используемый для зашифрованных файлов; если указан, он переопределяет пароль по умолчанию, заданный с помощью258259[`setpassword()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.setpassword)260261. Вызов262263[`read()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.read)264265на закрытом ZipFile приведёт к возникновению266267[`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError)268269.270271#### `[zipfile.ZipFile.testzip]ZipFile.testzip()`272273Читает все файлы в архиве и проверяет их CRC и заголовки файлов. Возвращает имя первого повреждённого файла или274275`None`276277, если все файлы в порядке. Вызов278279[`testzip()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.testzip)280281на закрытом ZipFile вызовет282283[`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError)284285.286287#### `[zipfile.ZipFile.write]ZipFile.write(filename[, arcname[, compress_type]])`288289Записывает файл с именем *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).290291> **Примечание**292>293> Официальной кодировки имён файлов для ZIP-файлов не существует. Если используются имена файлов в Unicode, необходимо преобразовать их в байтовые строки в нужной кодировке перед передачей в [`write()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.write). WinZip интерпретирует все имена файлов как закодированные в CP437, также известной как DOS Latin.294295> **Примечание**296>297> Архивные имена должны быть относительными по отношению к корню архива, то есть не должны начинаться с разделителя пути.298299> **Примечание**300>301> Если `arcname` (или `filename`, если `arcname` не указан) содержит нулевой байт, имя файла в архиве будет обрезано по нулевому байту.302303#### `[zipfile.ZipFile.writestr]ZipFile.writestr(zinfo_or_arcname, bytes)`304305Записывает строку *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).306307> **Примечание**308>309> При передаче экземпляра [`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).310311Также доступны следующие атрибуты данных:312313#### `[zipfile.ZipFile.debug]ZipFile.debug`314315Уровень отладочного вывода. Может быть установлен от316317`0`318319(по умолчанию, без вывода) до320321`3`322323(максимальный вывод). Отладочная информация записывается в324325`sys.stdout`326327.328329#### `[zipfile.ZipFile.comment]ZipFile.comment`330331Текст комментария, связанного с ZIP-файлом. При назначении комментария экземпляру332333[`ZipFile`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile)334335, созданному в режиме 'a' или 'w', это должна быть строка длиной не более 65535 байт. Комментарии длиннее этого значения будут усечены в записываемом архиве при вызове336337[`ZipFile.close()`](https://python-all.ru/3.0/library/zipfile.html#zipfile.ZipFile.close)338339.340341## Объекты PyZipFile342343Конструктор [`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).344345#### `[zipfile.PyZipFile.writepy]PyZipFile.writepy(pathname[, basename])`346347Search 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:348349```python350string.pyc                                # Top level name351test/__init__.pyc                         # Package directory352test/testall.pyc                          # Module test.testall353test/bogus/__init__.pyc                   # Subpackage directory354test/bogus/myfile.pyc                     # Submodule test.bogus.myfile355```356357## Объекты ZipInfo358359Экземпляры класса [`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-архива.360361Экземпляры имеют следующие атрибуты:362363#### `[zipfile.ZipInfo.filename]ZipInfo.filename`364365Имя файла в архиве.366367#### `[zipfile.ZipInfo.date_time]ZipInfo.date_time`368369Время и дата последнего изменения элемента архива. Это кортеж из шести значений:370371| Индекс | Значение |372| --- | --- |373| `0` | Год |374| `1` | Месяц (начиная с 1) |375| `2` | День месяца (начиная с 1) |376| `3` | Часы (начиная с 0) |377| `4` | Минуты (начиная с 0) |378| `5` | Секунды (начиная с 0) |379380#### `[zipfile.ZipInfo.compress_type]ZipInfo.compress_type`381382Тип сжатия для элемента архива.383384#### `[zipfile.ZipInfo.comment]ZipInfo.comment`385386Комментарий для отдельного элемента архива.387388#### `[zipfile.ZipInfo.extra]ZipInfo.extra`389390Данные поля расширения. В391392[Примечании к приложению PKZIP](https://python-all.ru/3.0/library/zipfile.html)393394содержатся комментарии о внутренней структуре данных, содержащихся в этой строке.395396#### `[zipfile.ZipInfo.create_system]ZipInfo.create_system`397398Система, создавшая ZIP-архив.399400#### `[zipfile.ZipInfo.create_version]ZipInfo.create_version`401402Версия PKZIP, создавшая ZIP-архив.403404#### `[zipfile.ZipInfo.extract_version]ZipInfo.extract_version`405406Версия PKZIP, необходимая для извлечения архива.407408#### `[zipfile.ZipInfo.reserved]ZipInfo.reserved`409410Должно быть равно нулю.411412#### `[zipfile.ZipInfo.flag_bits]ZipInfo.flag_bits`413414Биты флагов ZIP.415416#### `[zipfile.ZipInfo.volume]ZipInfo.volume`417418Номер тома заголовка файла.419420#### `[zipfile.ZipInfo.internal_attr]ZipInfo.internal_attr`421422Внутренние атрибуты.423424#### `[zipfile.ZipInfo.external_attr]ZipInfo.external_attr`425426Внешние атрибуты файла.427428#### `[zipfile.ZipInfo.header_offset]ZipInfo.header_offset`429430Смещение в байтах до заголовка файла.431432#### `[zipfile.ZipInfo.CRC]ZipInfo.CRC`433434CRC-32 несжатого файла.435436#### `[zipfile.ZipInfo.compress_size]ZipInfo.compress_size`437438Размер сжатых данных.439440#### `[zipfile.ZipInfo.file_size]ZipInfo.file_size`441442Размер несжатого файла.443