Содержание страницы
12.4. zipfile – Работа с ZIP-архивами¶zipfile – Work with ZIP archives
Новое в версии 1.6.
Исходный код: Lib/zipfile.py
Формат ZIP – распространённый стандарт архивации и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и просмотра содержимого ZIP-файлов. Любое продвинутое использование модуля требует понимания формата, описанного в PKZIP Application Note.
Этот модуль в настоящее время не поддерживает многодисковые ZIP-файлы. Он может обрабатывать ZIP-файлы, использующие расширения ZIP64 (то есть ZIP-файлы размером более 4 Гбайт). Он поддерживает дешифрование зашифрованных файлов в ZIP-архивах, но в настоящее время не может создать зашифрованный файл. Дешифрование выполняется крайне медленно, так как реализовано на чистом Python, а не на C.
Модуль определяет следующие элементы:
-
exception
zipfile.BadZipfile¶ Исключение, возникающее при повреждённых ZIP-файлах (старое название:
zipfile.error).
-
exception
zipfile.LargeZipFile¶ Исключение, возникающее, когда ZIP-файлу требуется функциональность ZIP64, но она не включена.
-
class
zipfile.ZipFile Класс для чтения и записи ZIP-файлов. Подробнее о конструкторе см. раздел Объекты ZipFile.
-
class
zipfile.PyZipFile¶ Класс для создания ZIP-архивов, содержащих библиотеки Python.
-
class
zipfile.ZipInfo([filename[, date_time]])¶ Класс для представления информации об элементе архива. Экземпляры этого класса возвращаются методами
getinfo()иinfolist()объектовZipFile. Большинству пользователей модуляzipfileне потребуется создавать их самостоятельно – достаточно использовать те, что созданы этим модулем. filename должен содержать полное имя элемента архива, а date_time – кортеж из шести полей, описывающих время последнего изменения файла. Описание полей приведено в разделе Объекты ZipInfo.
-
zipfile.is_zipfile(filename)¶ Возвращает
True, если filename является корректным ZIP-файлом (проверка по магическому числу), иначе возвращаетFalse. filename может быть файлом или файлоподобным объектом.Изменено в версии 2.7: Поддержка файлов и файлоподобных объектов.
-
zipfile.ZIP_STORED¶ Числовая константа для несжатого элемента архива.
-
zipfile.ZIP_DEFLATED¶ Числовая константа для обычного метода сжатия ZIP. Для этого требуется модуль
zlib. Другие методы сжатия в настоящее время не поддерживаются.
См. также
- Примечание по применению PKZIP
Документация по формату ZIP-файлов от Фила Каца, создателя формата и используемых алгоритмов.
- Домашняя страница Info-ZIP
Информация о программах для работы с ZIP-архивами и библиотеках для разработки проекта Info-ZIP.
12.4.1. Объекты ZipFile¶ZipFile Objects
-
class
zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])¶ Открывает ZIP-файл, где file может быть либо путём к файлу (строка), либо файлоподобным объектом. Параметр mode должен быть
'r'для чтения существующего файла,'w'для усечения и записи нового файла, или'a'для добавления к существующему файлу. Если mode равен'a'и file ссылается на существующий ZIP-файл, то в него добавляются новые файлы. Если file не ссылается на ZIP-файл, то к файлу добавляется новый ZIP-архив. Это предназначено для добавления ZIP-архива в другой файл (такой какpython.exe).Изменено в версии 2.6: Если mode равен
aи файл вообще не существует, он создаётся.compression – метод сжатия ZIP, используемый при записи архива, и должен быть
ZIP_STOREDилиZIP_DEFLATED; нераспознанные значения вызовутRuntimeError. Если указанZIP_DEFLATED, но модульzlibнедоступен, также возникаетRuntimeError. По умолчанию используетсяZIP_STORED. Если allowZip64 равенTrue, zipfile будет создавать ZIP-файлы с расширениями ZIP64, когда размер zip-файла превышает 2 ГБ. Если значение false (по умолчанию),zipfileвызовет исключение, когда ZIP-файл потребует расширений ZIP64. Расширения ZIP64 отключены по умолчанию, потому что стандартные команды zip и unzip в Unix (утилиты InfoZIP) не поддерживают эти расширения.Изменено в версии 2.7.1: Если файл создан с режимом
'a'или'w', а затем вызванclosedбез добавления каких-либо файлов в архив, в файл будут записаны соответствующие структуры ZIP для пустого архива.ZipFile также является контекстным менеджером и поэтому поддерживает оператор
with. В примере myzip закрывается после завершения блока оператораwith– даже если возникло исключение:with ZipFile('spam.zip', 'w') as myzip: myzip.write('eggs.txt')
Новое в версии 2.7: Добавлена возможность использовать
ZipFileв качестве менеджера контекста.
-
ZipFile.close()¶ Закрывает файл архива. Перед выходом из программы необходимо вызвать
close(), иначе важные записи не будут записаны.
-
ZipFile.getinfo(name)¶ Возвращает объект
ZipInfoс информацией об элементе архива name. Вызовgetinfo()для имени, отсутствующего в архиве, приведёт к возникновению исключенияKeyError.
-
ZipFile.infolist()¶ Возвращает список, содержащий объект
ZipInfoдля каждого элемента архива. Объекты расположены в том же порядке, что и их записи в реальном ZIP-файле на диске, если был открыт существующий архив.
-
ZipFile.namelist()¶ Возвращает список элементов архива по именам.
-
ZipFile.open(name[, mode[, pwd]])¶ Извлекает элемент из архива в виде файлоподобного объекта (ZipExtFile). name – это имя файла в архиве или объект
ZipInfo. Параметр mode, если указан, должен быть одним из следующих:'r'(по умолчанию),'U'или'rU'. Выбор'U'или'rU'включает поддержку универсальных символов новой строки в объекте только для чтения. pwd – пароль, используемый для зашифрованных файлов. Вызовopen()на закрытом ZipFile вызоветRuntimeError.Примечание
Объект, подобный файлу, доступен только для чтения и предоставляет следующие методы:
read(),readline(),readlines(),__iter__(),next().Примечание
Если ZipFile был создан передачей файлоподобного объекта в качестве первого аргумента конструктора, то объект, возвращаемый
open(), разделяет файловый указатель ZipFile. В таких условиях объект, возвращаемыйopen(), не должен использоваться после выполнения любых дополнительных операций над объектом ZipFile. Если ZipFile был создан передачей строки (имени файла) в качестве первого аргумента конструктора, тоopen()создаст новый файловый объект, который будет удерживаться ZipExtFile, что позволяет ему работать независимо от ZipFile.Примечание
Методы
open(),read()иextract()могут принимать имя файла или объектZipInfo. Это пригодится при попытке чтения ZIP-файла, содержащего элементы с повторяющимися именами.Новое в версии 2.6.
-
ZipFile.extract(member[, path[, pwd]])¶ Извлекает элемент из архива в текущий рабочий каталог; member должно быть его полным именем или объектом
ZipInfo). Информация о файле извлекается максимально точно. path указывает другой каталог для извлечения. member может быть именем файла или объектомZipInfo. pwd – пароль, используемый для зашифрованных файлов.Возвращает нормализованный путь (каталог или новый файл).
Новое в версии 2.6.
Примечание
Если имя файла элемента является абсолютным путём, диск/UNC-точка и начальные (обратные) слеши будут удалены, например:
///foo/barстановитсяfoo/barна Unix, аC:\foo\barстановитсяfoo\barна Windows. Все компоненты".."в имени файла элемента будут удалены, например:../../foo../../ba..rстановитсяfoo../ba..r. На Windows недопустимые символы (:,<,>,|,",?и*) заменяются подчёркиванием (_).
-
ZipFile.extractall([path[, members[, pwd]]])¶ Извлекает все элементы из архива в текущую рабочую директорию. path задаёт другую директорию для извлечения. members – необязательный параметр, должен быть подмножеством списка, возвращаемого
namelist(). pwd – пароль для зашифрованных файлов.Предупреждение
Никогда не извлекайте архивы из ненадёжных источников без предварительной проверки. Возможно создание файлов за пределами path, например, элементов с абсолютными именами, начинающимися с
"/", или с именами, содержащими две точки"..".Изменено в версии 2.7.4: Модуль zipfile пытается предотвратить это. См. примечание
extract().Новое в версии 2.6.
-
ZipFile.printdir()¶ Выводит оглавление архива в
sys.stdout.
-
ZipFile.setpassword(pwd)¶ Устанавливает pwd в качестве пароля по умолчанию для извлечения зашифрованных файлов.
Новое в версии 2.6.
-
ZipFile.read(name[, pwd])¶ Возвращает байты файла name из архива. name – имя файла в архиве или объект
ZipInfo. Архив должен быть открыт для чтения или добавления. pwd – пароль, используемый для зашифрованных файлов; если указан, он переопределяет пароль по умолчанию, заданный с помощьюsetpassword(). Вызовread()на закрытом ZipFile вызоветRuntimeError.Изменено в версии 2.6: Добавлен параметр pwd, и name теперь может быть объектом
ZipInfo.
-
ZipFile.testzip()¶ Читает все файлы в архиве и проверяет их CRC и заголовки файлов. Возвращает имя первого повреждённого файла или
None. Вызовtestzip()для закрытого ZipFile возбудитRuntimeError.
-
ZipFile.write(filename[, arcname[, compress_type]])¶ Записывает файл с именем filename в архив, присваивая ему архивное имя arcname (по умолчанию оно будет таким же, как filename, но без буквы диска и с удалёнными начальными разделителями пути). Если указан, compress_type переопределяет значение параметра compression, переданное конструктору для новой записи. Архив должен быть открыт в режиме
'w'или'a'– вызовwrite()для ZipFile, созданного в режиме'r', вызоветRuntimeError. Вызовwrite()на закрытом ZipFile вызоветRuntimeError.Примечание
Для ZIP-файлов не существует официальной кодировки имён файлов. Если у вас есть имена файлов в Юникоде, вы должны преобразовать их в байтовые строки в нужной кодировке перед передачей в
write(). WinZip интерпретирует все имена файлов как закодированные в CP437, также известной как DOS Latin.Примечание
Архивные имена должны быть относительными по отношению к корню архива, то есть не должны начинаться с разделителя пути.
Примечание
Если
arcname(илиfilename, еслиarcnameне указан) содержит нулевой байт, имя файла в архиве будет обрезано по этому байту.
-
ZipFile.writestr(zinfo_or_arcname, bytes[, compress_type])¶ Записывает строку bytes в архив; zinfo_or_arcname – это либо имя файла, которое будет присвоено в архиве, либо экземпляр
ZipInfo. Если это экземпляр, должны быть указаны как минимум имя файла, дата и время. Если это имя, дата и время устанавливаются в текущие дату и время. Архив должен быть открыт в режиме'w'или'a'– вызовwritestr()для ZipFile, созданного в режиме'r', вызоветRuntimeError. Вызовwritestr()на закрытом ZipFile вызоветRuntimeError.Если указан, compress_type переопределяет значение, заданное для параметра compression в конструкторе для новой записи, или в zinfo_or_arcname (если это экземпляр
ZipInfo).Примечание
При передаче экземпляра
ZipInfoв качестве параметра zinfo_or_arcname используемый метод сжатия будет тем, который указан в элементе compress_type данного экземпляраZipInfo. По умолчанию конструкторZipInfoустанавливает этот элемент вZIP_STORED.Изменено в версии 2.7: Аргумент compress_type.
Также доступны следующие атрибуты данных:
-
ZipFile.debug¶ Уровень отладочного вывода. Может быть установлен от
0(по умолчанию, без вывода) до3(максимальный вывод). Отладочная информация записывается вsys.stdout.
12.4.2. Объекты PyZipFile¶PyZipFile Objects
Конструктор PyZipFile принимает те же параметры, что и конструктор ZipFile. Экземпляры имеют один дополнительный метод по сравнению с объектами ZipFile.
-
PyZipFile.writepy(pathname[, basename])¶ Ищет файлы
*.pyи добавляет соответствующий файл в архив. Соответствующий файл – это файл*.pyo, если он доступен, иначе файл*.pyc, при необходимости компилируя. Если путь является файлом, имя файла должно заканчиваться на.py, и только (соответствующий) файл*.py[co]добавляется на верхний уровень (без информации о пути). Если путь является файлом, не заканчивающимся на.py, будет возбужденоRuntimeError. Если это каталог, и каталог не является каталогом пакета, то все файлы*.py[co]добавляются на верхний уровень. Если каталог является каталогом пакета, то все*.py[co]добавляются под именем пакета как путь к файлу, и если какие-либо подкаталоги являются каталогами пакетов, все они добавляются рекурсивно. basename предназначен только для внутреннего использования. Методwritepy()создаёт архивы с именами файлов, такими как:string.pyc # Имя верхнего уровня test/__init__.pyc # Каталог пакета test/test_support.pyc # Модуль test.test_support test/bogus/__init__.pyc # Каталог подпакета test/bogus/myfile.pyc # Подмодуль test.bogus.myfile
12.4.3. Объекты ZipInfo¶ZipInfo Objects
Экземпляры класса ZipInfo возвращаются методами getinfo() и infolist() объектов ZipFile. Каждый объект хранит информацию об одном элементе ZIP-архива.
Экземпляры имеют следующие атрибуты:
-
ZipInfo.filename¶ Имя файла в архиве.
-
ZipInfo.date_time¶ Время и дата последнего изменения элемента архива. Это кортеж из шести значений:
Индекс
Значение
0Год (>= 1980)
1Месяц (начиная с 1)
2День месяца (начиная с 1)
3Часы (начиная с 0)
4Минуты (начиная с 0)
5Секунды (начиная с 0)
Примечание
Формат ZIP-файлов не поддерживает метки времени до 1980 года.
-
ZipInfo.compress_type¶ Тип сжатия для элемента архива.
-
ZipInfo.comment¶ Комментарий для отдельного элемента архива.
-
ZipInfo.extra¶ Данные поля расширения. В Примечании к приложению PKZIP содержатся комментарии о внутренней структуре данных, содержащихся в этой строке.
-
ZipInfo.create_system¶ Система, создавшая ZIP-архив.
-
ZipInfo.create_version¶ Версия PKZIP, создавшая ZIP-архив.
-
ZipInfo.extract_version¶ Версия PKZIP, необходимая для извлечения архива.
-
ZipInfo.reserved¶ Должно быть равно нулю.
-
ZipInfo.flag_bits¶ Биты флагов ZIP.
-
ZipInfo.volume¶ Номер тома заголовка файла.
-
ZipInfo.internal_attr¶ Внутренние атрибуты.
-
ZipInfo.external_attr¶ Внешние атрибуты файла.
-
ZipInfo.header_offset¶ Смещение в байтах до заголовка файла.
-
ZipInfo.CRC¶ CRC-32 несжатого файла.
-
ZipInfo.compress_size¶ Размер сжатых данных.
-
ZipInfo.file_size¶ Размер несжатого файла.
12.4.4. Интерфейс командной строки¶Command-Line Interface
Модуль zipfile предоставляет простой интерфейс командной строки для работы
с ZIP-архивами.
Чтобы создать новый ZIP-архив, укажите его имя после параметра -c
и перечислите имена файлов, которые нужно включить:
$ python -m zipfile -c monty.zip spam.txt eggs.txt
Можно также передать каталог:
$ python -m zipfile -c monty.zip life-of-brian_1979/
Чтобы извлечь ZIP-архив в указанный каталог, используйте
параметр -e:
$ python -m zipfile -e monty.zip target-dir/
Для получения списка файлов в ZIP-архиве используйте параметр -l:
$ python -m zipfile -l monty.zip