zipfile — Работа с ZIP-архивами
Исходный код: Lib/zipfile.py
Формат ZIP-файлов — распространённый стандарт для архивирования и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и вывода списка содержимого ZIP-файла. Любое продвинутое использование этого модуля потребует понимания формата, описанного в приложении PKZIP.
В настоящее время этот модуль не поддерживает многодисковые ZIP-файлы. Он может обрабатывать ZIP-файлы, использующие расширения ZIP64 (то есть ZIP-файлы, размер которых превышает 4 ГБ). Модуль поддерживает расшифровку зашифрованных файлов в ZIP-архивах, но в настоящее время не может создавать зашифрованный файл. Расшифровка чрезвычайно медленная, так как она реализована на чистом Python, а не на C.
Модуль определяет следующие элементы:
-
exception zipfile.BadZipFile -
Исключение, генерируемое при работе с повреждёнными ZIP-файлами.
Новая функция в версии 3.2.
-
exception zipfile.BadZipfile -
Псевдоним
BadZipFileдля совместимости со старыми версиями Python.Устарело начиная с версии 3.2.
-
exception zipfile.LargeZipFile -
Исключение, генерируемое при попытке работы с ZIP-файлом, требующим функциональности ZIP64, но она отключена.
-
class zipfile.ZipFile -
Класс для чтения и записи ZIP-файлов. Подробное описание конструктора см. в разделе Объекты ZipFile.
-
class zipfile.PyZipFile -
Класс для создания ZIP-архивов, содержащих библиотеки Python.
-
class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0)) -
Класс, используемый для представления информации о члене архива. Экземпляры этого класса возвращаются методами
getinfo()иinfolist()объектовZipFile. Большинству пользователей модуляzipfileне потребуется создавать эти объекты, но только использовать те, которые созданы этим модулем. filename должен быть полным именем члена архива, а date_time — кортежем из шести полей, описывающих время последней модификации файла; поля описаны в разделе Объекты ZipInfo.
-
zipfile.is_zipfile(filename) -
Возвращает
True, если filename является допустимым ZIP-файлом на основе его магического числа; в противном случае возвращаетFalse. filename может быть файлом или файлоподобным объектом.Изменено в версии 3.1: Поддержка файлов и файлоподобных объектов.
-
zipfile.ZIP_STORED -
Числовой константа для несжатого члена архива.
-
zipfile.ZIP_DEFLATED -
Числовая константа для обычного метода сжатия ZIP. Требуется модуль
zlib.
-
zipfile.ZIP_BZIP2 -
Числовая константа для метода сжатия BZIP2. Требуется модуль
bz2.Новая функция в версии 3.3.
-
zipfile.ZIP_LZMA -
Числовая константа для метода сжатия LZMA. Требуется модуль
lzma.Новая функция в версии 3.3.
Примечание
Спецификация формата ZIP включает поддержку сжатия bzip2 с 2001 года и LZMA с 2006 года. Однако некоторые инструменты (включая более ранние версии Python) не поддерживают эти методы сжатия и могут либо отказаться обрабатывать ZIP-файл, либо не смогут извлечь отдельные файлы.
См. также
- PKZIP Application Note
-
Документация по формату ZIP-файлов от Фила Кэтца, создателя формата и используемых алгоритмов.
- Info-ZIP Home Page
-
Информация о проекте Info-ZIP, его программах для работы с ZIP-архивами и библиотеках разработки.
13.5.1. Объекты ZipFile
-
class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True) -
Открыть ZIP-архив, где file может быть путём к файлу (строка), объектом типа файла или объектом пути. Параметр mode должен быть
'r'для чтения существующего файла,'w'для обнуления и записи нового файла,'a'для добавления к существующему файлу или'x'для эксклюзивного создания и записи нового файла. Если mode равен'x'и file ссылается на существующий файл, будет поднята ошибкаFileExistsError. Если mode равен'a'и file ссылается на существующий ZIP-архив, к нему добавляются дополнительные файлы. Если file не ссылается на ZIP-архив, новый ZIP-архив добавляется в файл. Это предназначено для добавления ZIP-архива в другой файл (например,python.exe). Если mode равен'a'и файл вообще не существует, он создаётся. Если mode равен'r'или'a', файл должен быть итерируемым. compression — это метод сжатия ZIP для использования при записи архива и должен бытьZIP_STORED,ZIP_DEFLATED,ZIP_BZIP2илиZIP_LZMA; нераспознанные значения вызовутNotImplementedError. Если выбранZIP_DEFLATED,ZIP_BZIP2илиZIP_LZMA, но соответствующий модуль (zlib,bz2илиlzma) недоступен, будет поднята ошибкаRuntimeError. По умолчанию используетсяZIP_STORED. Если allowZip64 равноTrue(по умолчанию), zipfile создаст ZIP-файлы, использующие расширения ZIP64, если размер ZIP-файла превышает 4 ГБ. Если оно ложно,zipfileвызовет исключение, если для ZIP-файла потребуются расширения ZIP64.Если файл создан с режимом
'w','x'или'a'и затем вызванclosedбез добавления файлов в архив, в файл будут записаны соответствующие структуры ZIP для пустого архива.ZipFile также является контекстным менеджером и, следовательно, поддерживает инструкцию
with. В примере, myzip закрывается после завершения блокаwith, даже если произошла ошибка:with ZipFile('spam.zip', 'w') as myzip: myzip.write('eggs.txt')Добавлено в версии 3.2: Добавлена возможность использовать
ZipFileв качестве контекстного менеджера.Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.
Изменено в версии 3.5: Добавлена поддержка записи в неитерируемые потоки. Добавлена поддержка режима
'x'.Изменено в версии 3.6: Ранее, для нераспознанных значений сжатия поднималась ошибка
RuntimeError.Изменено в версии 3.6.2: Параметр file принимает объект пути.
-
ZipFile.close() -
Закрыть архивный файл. Вы должны вызвать
close()перед завершением программы, иначе важные записи не будут записаны.
-
ZipFile.getinfo(name) -
Возвращает объект
ZipInfoс информацией о члене архива name. Вызовgetinfo()для имени, отсутствующего в архиве, вызовет ошибкуKeyError.
-
ZipFile.infolist() -
Возвращает список, содержащий объект
ZipInfoдля каждого члена архива. Объекты упорядочены так же, как их записи в фактическом ZIP-файле на диске, если был открыт существующий архив.
-
ZipFile.namelist() -
Возвращает список имён членов архива.
-
ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False) -
Получение доступа к элементу архива как к бинарному файлоподобному объекту. name может быть либо именем файла внутри архива, либо объектом
ZipInfo. Параметр mode, если указан, должен быть'r'(по умолчанию) или'w'. pwd — пароль, используемый для расшифровки зашифрованных ZIP-архивов.open()также является менеджером контекста и поэтому поддерживает операторwith:with ZipFile('spam.zip') as myzip: with myzip.open('eggs.txt') as myfile: print(myfile.read())При использовании mode
'r'файлоподобный объект (ZipExtFile) является только для чтения и предоставляет следующие методы:read(),readline(),readlines(),__iter__(),__next__(). Эти объекты могут работать независимо от ZipFile.При использовании
mode='w', возвращается доступ к файлу для записи, который поддерживает методwrite(). Пока доступ к файлу для записи открыт, попытка чтения или записи других файлов в ZIP-архиве вызовет исключениеValueError.При записи файла, если размер файла заранее неизвестен, но может превышать 2 ГБ, передайте
force_zip64=Trueдля обеспечения того, что формат заголовка способен поддерживать большие файлы. Если размер файла известен заранее, создайте объектZipInfoс установленнымfile_sizeи используйте его как параметр name.Примечание
Методы
open(),read()иextract()могут принимать имя файла или объектZipInfo. Это будет полезно при чтении ZIP-архива, содержащего члены с повторяющимися именами.Изменено в версии 3.6: Убрана поддержка
mode='U'. Используйтеio.TextIOWrapperдля чтения сжатых текстовых файлов в режиме универсальных новых строк.Изменено в версии 3.6:
open()теперь может использоваться для записи файлов в архив с опциейmode='w'.Изменено в версии 3.6: Вызов
open()для закрытого ZipFile вызоветValueError. Ранее вызывалосьRuntimeError.
-
ZipFile.extract(member, path=None, pwd=None) -
Извлечение элемента из архива в текущую рабочую директорию; member должен быть полным именем или объектом
ZipInfo. Его информация о файле извлекается как можно точнее. path указывает другую директорию для извлечения. member может быть именем файла или объектомZipInfo. pwd — пароль для зашифрованных файлов.Возвращает нормализованный созданный путь (директория или новый файл).
Примечание
Если имя файла элемента — абсолютный путь, диск/общий ресурс UNC и ведущие (обратные) косые черты будут удалены, например:
///foo/barстанетfoo/barв Unix иC:\foo\barстанетfoo\barв Windows. И все компоненты".."в имени файла элемента будут удалены, например:../../foo../../ba..rстанетfoo../ba..r. В Windows неразрешенные символы (:,<,>,|,",?, и*) будут заменены на подчеркивание (_).Изменено в версии 3.6: Вызов
extract()для закрытого ZipFile вызоветValueError. Ранее вызывалосьRuntimeError.Изменено в версии 3.6.2: Параметр path принимает объект, подобный пути.
-
ZipFile.extractall(path=None, members=None, pwd=None) -
Извлечение всех элементов из архива в текущую рабочую директорию. path указывает другую директорию для извлечения. members — необязательный параметр, который должен быть подмножеством списка, возвращаемого методом
namelist(). pwd — пароль для зашифрованных файлов.Предупреждение
Никогда не извлекайте архивы из ненадежных источников без предварительного анализа. Возможно, файлы будут созданы вне path, например, элементы, у которых абсолютные имена файлов начинаются с
"/"или имена файлов содержат две точки"..". Этот модуль пытается предотвратить это. См. примечание кextract().Изменено в версии 3.6: Вызов
extractall()для закрытого ZipFile вызоветValueError. Ранее вызывалосьRuntimeError.Изменено в версии 3.6.2: Параметр path принимает объект, подобный пути.
-
ZipFile.printdir() -
Вывод оглавления архива в
sys.stdout.
-
ZipFile.setpassword(pwd) -
Установить pwd в качестве пароля по умолчанию для извлечения зашифрованных файлов.
-
ZipFile.read(name, pwd=None) -
Возвращает байты файла name в архиве. name — имя файла в архиве или объект
ZipInfo. Архив должен быть открыт для чтения или добавления. pwd — пароль для зашифрованных файлов, и если указан, он переопределит пароль по умолчанию, установленный с помощьюsetpassword(). Вызовread()для ZipFile, использующего метод сжатия, отличный отZIP_STORED,ZIP_DEFLATED,ZIP_BZIP2илиZIP_LZMAвызоветNotImplementedError. Ошибка также будет вызвана, если соответствующий модуль сжатия недоступен.Изменено в версии 3.6: Вызов
read()для закрытого ZipFile вызоветValueError. Ранее вызывалосьRuntimeError.
-
ZipFile.testzip() -
Прочитайте все файлы в архиве и проверьте их контрольные суммы CRC и заголовки файлов. Верните имя первого неверного файла, иначе верните
None.Изменено в версии 3.6: Вызов
testzip()для закрытого объекта ZipFile вызовет исключениеValueError. Ранее поднималось исключениеRuntimeError.
-
ZipFile.write(filename, arcname=None, compress_type=None) -
Записать файл с именем filename в архив, присвоив ему имя arcname (по умолчанию, это будет то же самое, что filename, но без буквы диска и с удаленными ведущими разделителями пути). Если задано, compress_type переопределяет значение, заданное для параметра compression конструктору для новой записи. Архив должен быть открыт в режиме
'w','x'или'a'.Примечание
Имена архивов должны быть относительными к корню архива, то есть они не должны начинаться с разделителя пути.
Примечание
Если
arcname(илиfilename, еслиarcnameне указано) содержит нулевой байт, имя файла в архиве будет обрезано до нулевого байта.Изменено в версии 3.6: Вызов
write()для объекта ZipFile, созданного в режиме'r'или закрытого объекта ZipFile, вызовет исключениеValueError. Ранее поднималось исключениеRuntimeError.
-
ZipFile.writestr(zinfo_or_arcname, data[, compress_type]) -
Записать файл в архив. Содержимое — data, которое может быть строкой
strили объектомbytes; если это строкаstr, она сначала кодируется в UTF-8. zinfo_or_arcname — это либо имя файла, которое он получит в архиве, либо объектZipInfo. Если это объект, то, по крайней мере, должны быть заданы имя файла, дата и время. Если это имя, то дата и время устанавливаются на текущие значения. Архив должен быть открыт в режиме'w','x'или'a'.Если задано, compress_type переопределяет значение, заданное для параметра compression конструктору для новой записи, или в zinfo_or_arcname (если это объект
ZipInfo).Примечание
При передаче объекта
ZipInfoв качестве параметра zinfo_or_arcname, используемый метод сжатия будет тем, что указано в члене compress_type переданного объектаZipInfo. По умолчанию конструкторZipInfoустанавливает этот член вZIP_STORED.Изменено в версии 3.2: Аргумент compress_type.
Изменено в версии 3.6: Вызов
writestr()для объекта ZipFile, созданного в режиме'r'или закрытого объекта ZipFile, вызовет исключениеValueError. Ранее поднималось исключениеRuntimeError.
Доступны следующие атрибуты данных:
-
ZipFile.filename -
Имя файла ZIP.
-
ZipFile.debug -
Уровень отладочного вывода. Может быть установлен от
0(по умолчанию, без вывода) до3(максимальный вывод). Информация об отладке записывается вsys.stdout.
-
ZipFile.comment -
Комментарий, связанный с файлом ZIP, как объект
bytes. Если присваивать комментарий объектуZipFile, созданному в режиме'w','x'или'a', он должен быть не длиннее 65535 байт. Комментарии длиннее этого будут обрезанны.
13.5.2. Объекты PyZipFile
Конструктор PyZipFile принимает те же параметры, что и конструктор ZipFile, и один дополнительный параметр, optimize.
-
class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1) -
Новое в версии 3.2: Параметр optimize.
Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.
Объекты имеют один метод в дополнение к методам объектов
ZipFile:-
writepy(pathname, basename='', filterfunc=None) -
Поиск файлов
*.pyи добавление соответствующего файла в архив.Если параметр optimize для
PyZipFileне был указан или-1, соответствующий файл —*.pycфайл, компиляция при необходимости.Если параметр optimize для
PyZipFileбыл0,1или2, в архив добавляются только файлы с этим уровнем оптимизации (см.compile()), компиляция при необходимости.Если pathname — файл, имя файла должно заканчиваться на
.py, и только соответствующий*.pycфайл добавляется на верхнем уровне (без информации о пути). Если pathname — файл, не заканчивающийся на.py, будет поднято исключениеRuntimeError. Если это каталог, и каталог не является каталогом пакета, то все файлы*.pycдобавляются на верхнем уровне. Если каталог является каталогом пакета, все*.pycдобавляются под именем пакета как путь к файлу, а если какие-либо подкаталоги являются каталогами пакетов, все они добавляются рекурсивно.basename предназначен только для внутреннего использования.
filterfunc, если задано, должно быть функцией, принимающей один строковый аргумент. Оно будет передаваться каждому пути (включая каждый отдельный полный путь к файлу) перед его добавлением в архив. Если filterfunc возвращает ложное значение, путь не будет добавлен, и если это каталог, его содержимое будет проигнорировано. Например, если все наши тестовые файлы находятся в каталогах
testили начинаются со строкиtest_, мы можем использовать filterfunc, чтобы исключить их:>>> zf = PyZipFile('myprog.zip') >>> def notests(s): ... fn = os.path.basename(s) ... return (not (fn == 'test' or fn.startswith('test_'))) >>> zf.writepy('myprog', filterfunc=notests)Метод
writepy()создаёт архивы с именами файлов такого вида: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
Новое в версии 3.4: Параметр filterfunc.
Изменено в версии 3.6.2: Параметр pathname принимает объект-путь.
-
13.5.3. Объекты ZipInfo
Экземпляры класса ZipInfo возвращаются методами getinfo() и infolist() объектов ZipFile. Каждый объект хранит информацию об одном элементе архива ZIP.
Существует один метод класса для создания экземпляра ZipInfo для файла файловой системы:
-
classmethod ZipInfo.from_file(filename, arcname=None) -
Создать экземпляр
ZipInfoдля файла в файловой системе для добавления его в zip-архив.filename должен быть путем к файлу или каталогу в файловой системе.
Если указано arcname, оно используется как имя в архиве. Если arcname не указано, имя будет таким же, как filename, но без буквенного обозначения диска и начальных символов пути.
Введено в версии 3.6.
Изменено в версии 3.6.2: Параметр filename принимает объект пути.
Экземпляры имеют следующие методы и атрибуты:
-
ZipInfo.is_dir() -
Возвращает
True, если этот член архива является каталогом.Это использует имя записи: каталоги всегда должны заканчиваться
/.Введено в версии 3.6.
-
ZipInfo.filename -
Имя файла в архиве.
-
ZipInfo.date_time -
Время и дата последнего изменения члена архива. Это кортеж из шести значений:
Индекс
Значение
0Год (>= 1980)
1Месяц (с 1)
2День месяца (с 1)
3Часы (с 0)
4Минуты (с 0)
5Секунды (с 0)
Примечание
Формат ZIP-архивов не поддерживает метки времени до 1980 года.
-
ZipInfo.compress_type -
Тип сжатия для члена архива.
-
ZipInfo.comment -
Комментарий для отдельного члена архива в виде объекта
bytes.
-
ZipInfo.extra -
Данные расширения. Прикладная заметка PKZIP содержит некоторые комментарии о внутренней структуре данных, содержащихся в этом объекте
bytes.
-
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 -
Размер нескомпрессированного файла.
13.5.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
13.5.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/3.6/library/zipfile.html