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.Path -
Обёртка, совместимая с pathlib, для ZIP-файлов. Подробности см. в разделе Объекты Path.
Новая в версии 3.8.
-
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
-
Документация по формату ZIP от Фила Кэтца, создателя формата и используемых алгоритмов.
- Главная страница Info-ZIP
-
Информация о проекте Info-ZIP, программы архивирования ZIP и библиотеках разработки.
Объекты ZipFile
-
class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=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 ГБ. Если оно равноfalsezipfileвызовет исключение, когда для ZIP-файла потребуются расширения ZIP64.Параметр compresslevel управляет уровнем сжатия при записи файлов в архив. При использовании
ZIP_STOREDилиZIP_LZMAон не оказывает влияния. При использованииZIP_DEFLATEDпринимаются целые числа от0до9(см.zlibдля получения дополнительной информации). При использованииZIP_BZIP2принимаются целые числа от1до9(см.bz2для получения дополнительной информации).Аргумент strict_timestamps, если установлен в
False, позволяет архивировать файлы, более старые, чем 01.01.1980, с установкой отметки времени на 01.01.1980. Аналогичное поведение наблюдается с файлами, более новыми, чем 31.12.2107, отметка времени также устанавливается на предельное значение.Если файл создан с режимом
'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 принимает объект-путь.
В версии 3.7: Добавлен параметр compresslevel.
В версии 3.8: Добавлен ключевой аргумент strict_timestamps
-
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(),seek(),tell(),__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, compresslevel=None) -
Запишите файл с именем filename в архив, присвоив ему имя arcname (по умолчанию, это будет то же самое, что filename, но без букв диска и с удаленными начальными разделителями путей). Если указано, compress_type переопределяет значение, заданное параметром compression в конструкторе для новой записи. Аналогично, compresslevel переопределит конструктор, если задан. Архив должен быть открыт в режиме
'w','x'или'a'.Примечание
Имена архивов должны быть относительными к корню архива, то есть они не должны начинаться с разделителя путей.
Примечание
Если
arcname(илиfilename, еслиarcnameне указано) содержит нулевой байт, имя файла в архиве будет усечено до нулевого байта.Изменено в версии 3.6: Вызов
write()для объекта ZipFile, созданного в режиме'r'или закрытого объекта ZipFile, вызовет исключениеValueError. Ранее вызывалось исключениеRuntimeError.
-
ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None) -
Запишите файл в архив. Содержимое — data, которое может быть экземпляром
strилиbytes; если этоstr, оно сначала кодируется в UTF-8. zinfo_or_arcname — это либо имя файла, которое ему будет присвоено в архиве, либо экземплярZipInfo. Если это экземпляр, должны быть указаны хотя бы имя файла, дата и время. Если это имя, дата и время устанавливаются на текущую дату и время. Архив должен быть открыт в режиме'w','x'или'a'.Если указано, compress_type переопределяет значение, заданное параметром compression в конструкторе для новой записи или в zinfo_or_arcname (если это экземпляр
ZipInfo). Аналогично, compresslevel переопределит конструктор, если задан.Примечание
При передаче экземпляра
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.
Объекты пути
-
class zipfile.Path(root, at='') -
Создает объект пути из
rootархива zip (который может быть экземпляромZipFileилиfileподходящим для передачи конструкторуZipFile).atуказывает расположение этого пути в архиве zip, например, ‘dir/file.txt’, ‘dir/’ или ''. По умолчанию — пустая строка, обозначающая корень.
Объекты пути предоставляют следующие функции объектов pathlib.Path:
Объекты пути можно перебирать, используя оператор /.
-
Path.name -
Последний компонент пути.
-
Path.open(*, **) -
Вызывает
ZipFile.open()для текущего пути. Принимает те же аргументы, что иZipFile.open().Предупреждение
Подпись этой функции меняется несовместимым образом в Python 3.9. Для совместимости с будущими версиями рассмотрите использование стороннего пакета zipp.Path (3.0 или более поздней версии).
-
Path.iterdir() -
Перечислите дочерние элементы текущей директории.
-
Path.is_dir() -
Возвращает
Trueесли текущий контекст ссылается на директорию.
-
Path.is_file() -
Возвращает
Trueесли текущий контекст ссылается на файл.
-
Path.exists() -
Возвращает
Trueесли текущий контекст ссылается на файл или директорию в файле zip.
-
Path.read_text(*, **) -
Прочтите текущий файл как текст с поддержкой юникода. Позиционные и ключевые аргументы передаются в
io.TextIOWrapper(кромеbuffer, которое подразумевается контекстом).
-
Path.read_bytes() -
Прочитайте текущий файл как байты.
Объекты 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 принимает объект, подобный пути.
Изменено в версии 3.7: Рекурсивный сортировка записей каталогов.
-
Объекты ZipInfo
Экземпляры класса ZipInfo возвращаются методами getinfo() и infolist() объектов ZipFile. Каждый объект хранит информацию об одном элементе архива ZIP.
Существует один метод класса для создания экземпляра ZipInfo для файла файловой системы:
-
classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True) -
Создаёт экземпляр
ZipInfoдля файла в файловой системе, в качестве подготовки к добавлению его в файл zip.filename должен быть путём к файлу или каталогу в файловой системе.
Если указано arcname, оно используется в качестве имени внутри архива. Если arcname не указано, имя будет таким же, как filename, но без буквенного обозначения диска и ведущих разделителей путей.
Аргумент strict_timestamps, установленный в
False, позволяет архивировать файлы, созданные до 1980-01-01, но при этом дата и время устанавливаются на 1980-01-01. Аналогичное поведение наблюдается для файлов, созданных после 2107-12-31; в этом случае дата и время также устанавливаются на предельное значение.Введено в версии 3.6.
Изменено в версии 3.6.2: Параметр filename принимает объект, подобный пути.
Введено в версии 3.8: Ключевой аргумент strict_timestamps
Экземпляры имеют следующие методы и атрибуты:
-
ZipInfo.is_dir() -
Возвращает
True, если этот член архива является каталогом.Для этого используется имя записи: каталоги всегда должны заканчиваться на
/.Введено в версии 3.6.
-
ZipInfo.filename -
Имя файла в архиве.
-
ZipInfo.date_time -
Время и дата последнего изменения элемента архива. Это кортеж из шести значений:
Индекс
Значение
0Год (>= 1980)
1Месяц (основан на единице)
2День месяца (основан на единице)
3Часы (отсчёт от нуля)
4Минуты (отсчёт от нуля)
5Секунды (отсчёт от нуля)
Примечание
Формат файла ZIP не поддерживает временные метки до 1980 года.
-
ZipInfo.compress_type -
Тип сжатия для элемента архива.
-
ZipInfo.comment -
Комментарий к отдельному элементу архива как объект
bytes.
-
ZipInfo.extra -
Данные расширяющего поля. PKZIP Application Note содержит некоторые комментарии по внутренней структуре данных, содержащихся в этом объекте
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 -
Размер нескомпрессированного файла.
Интерфейс командной строки
Модуль 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
Опции командной строки
-
-l <zipfile> -
--list <zipfile> -
Отобразить список файлов в архиве ZIP.
-
-c <zipfile> <source1> ... <sourceN> -
--create <zipfile> <source1> ... <sourceN> -
Создать архив ZIP из исходных файлов.
-
-e <zipfile> <output_dir> -
--extract <zipfile> <output_dir> -
Извлечь архив ZIP в целевую директорию.
-
-t <zipfile> -
--test <zipfile> -
Проверить, является ли архив ZIP валидным.
Возможные проблемы при распаковке
Распаковка в модуле zipfile может завершиться ошибкой из-за проблем, перечисленных ниже.
Из самого файла
Распаковка может завершиться ошибкой из-за неправильного пароля / контрольной суммы CRC / формата ZIP или неподдерживаемого метода сжатия / дешифрования.
Ограничения файловой системы
Превышение ограничений различных файловых систем может привести к ошибке распаковки. Например, допустимые символы в записях каталога, длина имени файла, длина пути, размер одного файла и количество файлов и т. д.
Ограничения ресурсов
Недостаток памяти или дискового пространства приведет к ошибке распаковки. Например, «бомбы ZIP» (также известные как бомбы ZIP) применяются к библиотеке zipfile и могут привести к исчерпанию дискового пространства.
Прерывание
Прерывание процесса распаковки, например, нажатием клавиш Ctrl+C или завершением процесса распаковки, может привести к неполной распаковке архива.
Поведение распаковки по умолчанию
Незнание поведения распаковки по умолчанию может привести к непредвиденным результатам распаковки. Например, при повторной распаковке одного и того же архива файлы перезаписываются без запроса.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/zipfile.html