zipfile — Работа с архивами ZIP
Исходный код: Lib/zipfile.py
Формат ZIP-архивов — распространённый стандарт архивирования и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и просмотра содержимого ZIP-архивов. Любое продвинутое использование этого модуля потребует понимания формата, определённого в PKZIP Application Note.
В настоящий момент этот модуль не поддерживает многодисковые 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-архивами.
Объекты ZipFile
-
class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None) -
Открыть 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, когда размер zipfile превышает 4 ГБ. Если оно равноfalsezipfileвызовет исключение, когда ZIP-файл будет требовать расширения ZIP64.Параметр compresslevel управляет уровнем сжатия при записи файлов в архив. При использовании
ZIP_STOREDилиZIP_LZMAон не оказывает никакого влияния. При использованииZIP_DEFLATEDпринимаются целые числа от0до9(подробнее см.zlib). При использованииZIP_BZIP2принимаются целые числа от1до9(подробнее см.bz2).Если файл создан с режимами
'w','x'или'a'и затемclosedбез добавления каких-либо файлов в архив, в файл будут записаны соответствующие структуры ZIP для пустого архива.ZipFile также является менеджером контекста и, следовательно, поддерживает инструкцию
with. В примере, myzip закрывается после завершения блока инструкций после инструкцииwith— даже если возникает исключение:with ZipFile('spam.zip', 'w') as myzip: myzip.write('eggs.txt')New in version 3.2: Добавлена возможность использования
ZipFileкак менеджера контекста.Changed in version 3.4: Расширения ZIP64 включены по умолчанию.
Changed in version 3.5: Добавлена поддержка записи в потоки без возможности поиска. Добавлена поддержка режима
'x'.Changed in version 3.6: Ранее для нераспознанных значений сжатия поднималось исключение
RuntimeError.Changed in version 3.6.2: Параметр file принимает объект, подобный пути.
Changed in version 3.7: Добавлен параметр compresslevel.
-
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.
-
ZipFile.comment -
Комментарий к файлу ZIP как объект
bytes. При присваивании комментария объектуZipFile, созданному в режиме'w','x'или'a', он не должен превышать 65535 байт. Комментарии, превышающие этот размер, будут усечены.
Объекты 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) -
Создайте экземпляр
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Месяц (основанный на единице)
2День месяца (основанный на единице)
3Часы (нулевые)
4Минуты (нулевые)
5Секунды (нулевые)
Примечание
Формат файла 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 -
Размер несжатого файла.
Интерфейс командной строки
Модуль 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 валидным или нет.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/zipfile.html