zipfile — Работа с архивами ZIP
Новое в версии 1.6.
Исходный код: Lib/zipfile.py
Формат ZIP — распространённый стандарт архивирования и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и просмотра содержимого архива ZIP. Для продвинутого использования этого модуля необходимо понимание формата, как определено в приложении PKZIP.
Этот модуль в настоящее время не поддерживает многодисковые 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 Application Note
-
Документация по формату ZIP от Фила Кэтца, создателя формата и алгоритмов.
- Info-ZIP Home Page
-
Информация о проекте Info-ZIP, о программах и библиотеках разработки для ZIP-архивов.
1. Объекты ZipFile
-
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 (утилиты Info-ZIP) не поддерживают эти расширения.Изменено в версии 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]]) -
Извлечь член архива в виде объекта file-like (ZipExtFile). name — имя файла в архиве или объект
ZipInfo. Параметр mode, если указан, должен быть одним из следующих:'r'(по умолчанию),'U', или'rU'. Выбор'U'или'rU'включит поддержку универсальных новых строк в объекте только для чтения. pwd — пароль, используемый для зашифрованных файлов. Вызовopen()для закрытого ZipFile вызоветRuntimeError.Примечание
Объект file-like является только для чтения и предоставляет следующие методы:
read(),readline(),readlines(),__iter__(),next().Примечание
Если ZipFile был создан путём передачи объекта file-like в качестве первого аргумента конструктору, то объект, возвращаемый
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-файлов. Если у вас есть имена файлов unicode, вы должны преобразовать их в байтовую строку в желаемом кодировании, прежде чем передавать их в
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.
-
ZipFile.comment -
Текст комментария, связанный с файлом ZIP. Если вы присваиваете комментарий объекту
ZipFile, созданному в режиме ‘a’ или ‘w’, это должна быть строка не длиннее 65535 байт. Комментарии длиннее этого будут усечены в создаваемом архиве, когда вызоветсяclose().
2. Объекты PyZipFile
Конструктор PyZipFile принимает те же параметры, что и конструктор ZipFile. Экземпляры имеют один метод в дополнение к методам объектов ZipFile.
-
PyZipFile.writepy(pathname[, basename]) -
Поиск файлов
*.pyи добавление соответствующего файла в архив. Соответствующий файл — это файл*.pyoесли он доступен, иначе — файл*.pyc(при необходимости компилируется). Если путь — к файлу, имя файла должно заканчиваться на.py, и только соответствующий*.py[co]файл добавляется на верхнем уровне (без информации о пути). Если путь к файлу не заканчивается на.py, будет поднято исключениеRuntimeError. Если это директория, и директория не является директорией пакета, то все файлы*.py[co]добавляются на верхнем уровне. Если директория является директорией пакета, то все*.py[co]добавляются под именем пакета в качестве пути к файлу, и если какие-либо поддиректории являются директориями пакетов, все они добавляются рекурсивно. basename предназначен только для внутреннего использования. Методwritepy()создаёт архивы с именами файлов такого типа:string.pyc # Top level name test/__init__.pyc # Package directory test/test_support.pyc # Module test.test_support test/bogus/__init__.pyc # Subpackage directory test/bogus/myfile.pyc # Submodule test.bogus.myfile
3. Объекты ZipInfo
Экземпляры класса ZipInfo возвращаются методами getinfo() и infolist() объектов ZipFile. Каждый объект хранит информацию об одном элементе архива ZIP.
Экземпляры имеют следующие атрибуты:
-
ZipInfo.filename -
Имя файла в архиве.
-
ZipInfo.date_time -
Время и дата последнего изменения элемента архива. Это кортеж из шести значений:
Индекс
Значение
0Год (>= 1980)
1Месяц (основан на 1)
2День месяца (основан на 1)
3Часы (отсчёт от нуля)
4Минуты (отсчёт от нуля)
5Секунды (отсчёт от нуля)
Примечание
Формат файла 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 -
Размер нескомпрессированного файла.
4. Командная строка
Модуль 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
4.1. Опции командной строки
-
-l <zipfile> -
Отобразить файлы в архиве ZIP.
-
-c <zipfile> <source1> ... <sourceN> -
Создать архив ZIP из исходных файлов.
-
-e <zipfile> <output_dir> -
Извлечь архив ZIP в целевую директорию.
-
-t <zipfile> -
Проверить, является ли архив ZIP допустимым.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/zipfile.html