zipfile — Работа с ZIP-архивами
Исходный код: Lib/zipfile/
Формат ZIP — распространённый стандарт архивирования и сжатия. Этот модуль предоставляет средства для создания, чтения, записи, добавления файлов и просмотра содержимого ZIP-файлов. Для расширенного использования модуля потребуется понимание формата, описанного в документе PKZIP Application Note.
Этот модуль не поддерживает многотомные ZIP-файлы. Он поддерживает ZIP-файлы, использующие расширения ZIP64 (то есть ZIP-файлы размером более 4 ГиБ). Модуль поддерживает расшифровку зашифрованных файлов в ZIP-архивах, но не позволяет создавать зашифрованные файлы. Расшифровка выполняется крайне медленно, поскольку реализована на чистом Python, а не на C.
Для работы со сжатыми архивами требуются необязательные модули, такие как zlib, bz2, lzma и compression.zstd. Если в вашей копии CPython отсутствует какой-либо из них, обратитесь к документации вашего дистрибутива (то есть того, кто предоставил вам Python). Если вы являетесь поставщиком дистрибутива, см. раздел Требования к необязательным модулям.
Модуль определяет следующие элементы:
-
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.Path, включая полный интерфейсimportlib.resources.abc.Traversable.Добавлено в версии 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.Изменено в версии 3.13: Добавлен открытый атрибут
compress_level, предоставляющий доступ к ранее защищённому атрибуту_compresslevel. Старое защищённое имя продолжает работать как свойство для обратной совместимости.-
_for_archive(archive) -
Устанавливает для date_time, атрибутов сжатия и внешних атрибутов подходящие значения по умолчанию, используемые в
ZipFile.writestr().Возвращает self для цепочки вызовов.
Добавлено в версии 3.14.
-
-
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.
-
zipfile.ZIP_ZSTANDARD -
Числовая константа для сжатия Zstandard. Для этого требуется модуль
compression.zstd.Примечание
В APPNOTE 6.3.7 методу сжатия Zstandard был присвоен идентификатор
20. В APPNOTE 6.3.8 его изменили на93во избежание конфликтов, а идентификатор20признали устаревшим. Для обеспечения совместимости модульzipfileчитает оба идентификатора, но записывает данные только с идентификатором93.Добавлено в версии 3.14.
Примечание
Спецификация формата ZIP поддерживает сжатие bzip2 с 2001 года, сжатие LZMA — с 2006 года, а сжатие Zstandard — с 2020 года. Однако некоторые инструменты (в том числе старые версии Python) не поддерживают эти методы сжатия и могут либо полностью отказаться обрабатывать ZIP-файл, либо не извлечь отдельные файлы.
См. также
- документ PKZIP Application Note
-
Документация по формату ZIP, написанная Филом Кацем — создателем формата и использованных алгоритмов.
- Главная страница Info-ZIP
-
Информация о программах для работы с ZIP-архивами и библиотеках разработки проекта Info-ZIP.
Объекты ZipFile
-
class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=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илиZIP_ZSTANDARD; неизвестные значения приводят к вызову исключенияNotImplementedError. Если заданоZIP_DEFLATED,ZIP_BZIP2,ZIP_LZMAилиZIP_ZSTANDARD, но соответствующий модуль (zlib,bz2,lzmaилиcompression.zstd) недоступен, вызывается исключениеRuntimeError. Значение по умолчанию —ZIP_STORED.Если allowZip64 равно
True(значение по умолчанию), zipfile создаёт ZIP-файлы, использующие расширения ZIP64, если размер zipfile превышает 4 ГиБ. Если оно равноfalse,zipfileвызовет исключение, если для ZIP-файла потребуются расширения ZIP64.Параметр compresslevel задаёт уровень сжатия при записи файлов в архив. При использовании
ZIP_STOREDилиZIP_LZMAон не влияет на результат. При использованииZIP_DEFLATEDдопускаются целые числа от0до9(подробности см. вzlib). При использованииZIP_BZIP2допускаются целые числа от1до9(подробности см. вbz2). При использованииZIP_ZSTANDARDобычно допускаются целые числа от-131072до22(подробнее о получении допустимых значений и их значении см. вCompressionParameter.compression_level).Аргумент strict_timestamps, если задан
False, позволяет архивировать файлы с датой до 1980-01-01, устанавливая для них временную метку 1980-01-01. Аналогичное поведение применяется к файлам с датой после 2107-12-31: временная метка также устанавливается на предельное значение.Если mode равен
'r', параметру metadata_encoding можно присвоить имя кодека, который будет использоваться для декодирования метаданных, таких как имена элементов и комментарии ZIP.Если файл создан в режиме
'w','x'или'a', а затем вызван методclosedбез добавления файлов в архив, в файл будут записаны соответствующие структуры пустого ZIP-архива.ZipFile также является менеджером контекста и поэтому поддерживает инструкцию
with. В примере myzip закрывается после завершения блока инструкцииwith— даже если возникает исключение:with ZipFile('spam.zip', 'w') as myzip: myzip.write('eggs.txt')Примечание
metadata_encoding — это параметр, общий для всего экземпляра ZipFile. Задать его отдельно для каждого элемента невозможно.
Этот атрибут служит обходным решением для устаревших реализаций, создающих архивы с именами в кодировке текущей локали или кодовой странице (в основном в Windows). Согласно стандарту .ZIP, кодировка метаданных может быть указана как кодовая страница IBM (по умолчанию) или UTF-8 с помощью флага в заголовке архива. Этот флаг имеет приоритет над metadata_encoding, который является расширением, специфичным для Python.
Изменено в версии 3.2: Добавлена возможность использовать
ZipFileв качестве менеджера контекста.Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.
Изменено в версии 3.5: Добавлена поддержка записи в потоки, не поддерживающие перемещение. Добавлена поддержка режима
'x'.Изменено в версии 3.6: Ранее для неизвестных значений сжатия вызывалось обычное исключение
RuntimeError.Изменено в версии 3.6.2: Параметр file принимает объект, подобный пути.
Изменено в версии 3.7: Добавлен параметр compresslevel.
Изменено в версии 3.8: Параметр strict_timestamps, доступный только по ключевому слову.
Изменено в версии 3.11: Добавлена поддержка указания кодировки имён элементов при чтении метаданных из каталога и заголовков файлов zipfile.
-
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-файлов в виде объектаbytes.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.В обоих случаях файловый объект также имеет атрибуты
name, эквивалентный имени файла в архиве, иmode, значение которого равно'rb'или'wb'в зависимости от режима ввода.При записи файла, если его размер заранее неизвестен, но может превысить 2 ГиБ, передайте
force_zip64=True, чтобы гарантировать, что формат заголовка поддерживает большие файлы. Если размер файла заранее известен, создайте объектZipInfo, задайте значениеfile_sizeи используйте этот объект в качестве параметра name.Примечание
Методы
open(),read()иextract()принимают имя файла или объектZipInfo. Это удобно, если нужно прочитать ZIP-файл, содержащий элементы с одинаковыми именами.Изменено в версии 3.6: Удалена поддержка
mode='U'. Для чтения сжатых текстовых файлов в режиме универсальных переводов строк используйтеio.TextIOWrapper.Изменено в версии 3.6: Теперь
ZipFile.open()можно использовать для записи файлов в архив с параметромmode='w'.Изменено в версии 3.6: Вызов
open()для закрытого ZipFile вызовет исключениеValueError. Ранее вызывалось исключениеRuntimeError.Изменено в версии 3.13: Для файлового объекта, доступного для записи, добавлены атрибуты
nameиmode. Значение атрибутаmodeдля файлового объекта, доступного для чтения, изменено с'r'на'rb'.
-
ZipFile.extract(member, path=None, pwd=None) -
Извлекает элемент из архива в текущий рабочий каталог; member должно быть его полным именем или объектом
ZipInfo. Информация о файле извлекается с максимально возможной точностью. Параметр path задаёт другой каталог для извлечения. member может быть именем файла или объектомZipInfo. pwd — пароль для зашифрованных файлов в виде объектаbytes.Возвращает нормализованный путь созданного объекта (каталога или нового файла).
Примечание
Если имя элемента является абсолютным путём, корень диска или сетевой ресурс 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 — пароль для зашифрованных файлов в виде объектаbytes.Предупреждение
Никогда не извлекайте архивы из ненадёжных источников без предварительной проверки. Файлы могут быть созданы за пределами path, например, если элементы имеют абсолютные имена файлов или имена с компонентами «..». Этот модуль пытается предотвратить такое поведение. См. примечание к
extract().Изменено в версии 3.6: Вызов
extractall()для закрытого ZipFile вызовет исключениеValueError. Ранее вызывалось исключениеRuntimeError.Изменено в версии 3.6.2: Параметр path принимает объект, подобный пути.
-
ZipFile.printdir() -
Выводит оглавление архива в
sys.stdout.
-
ZipFile.setpassword(pwd) -
Устанавливает pwd (объект
bytes) в качестве пароля по умолчанию для извлечения зашифрованных файлов.
-
ZipFile.read(name, pwd=None) -
Возвращает байты файла name из архива. name — имя файла в архиве или объект
ZipInfo. Архив должен быть открыт для чтения или добавления. pwd — пароль для зашифрованных файлов в виде объектаbytes; если он указан, то переопределяет пароль по умолчанию, заданный с помощьюsetpassword(). Вызовread()для ZipFile, использующего метод сжатия, отличный отZIP_STORED,ZIP_DEFLATED,ZIP_BZIP2,ZIP_LZMAилиZIP_ZSTANDARD, вызовет исключение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'.Примечание
Исторически стандарт ZIP не определял кодировку метаданных, но настоятельно рекомендовал CP437 (исходную кодировку IBM PC) для обеспечения совместимости. В последних версиях разрешено использовать только UTF-8. В этом модуле для записи имён элементов автоматически используется UTF-8, если они содержат символы вне ASCII. Записывать имена элементов в кодировке, отличной от ASCII или UTF-8, невозможно.
Примечание
Имена в архиве должны быть относительными к корню архива, то есть не должны начинаться с разделителя пути.
Примечание
Если
arcname(илиfilename, еслиarcnameне задан) содержит нулевой байт, имя файла в архиве будет усечено на этом байте.Примечание
Начальная косая черта в имени файла может сделать архив недоступным для открытия в некоторых ZIP-программах в Windows.
Изменено в версии 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, он переопределяет значение, заданное конструктору.Примечание
Если в качестве параметра zinfo_or_arcname передан экземпляр
ZipInfo, будет использоваться метод сжатия, указанный в атрибуте compress_type этого экземпляраZipInfo. По умолчанию конструкторZipInfoустанавливает для этого атрибута значениеZIP_STORED.Изменено в версии 3.2: Аргумент compress_type.
Изменено в версии 3.6: Вызов
writestr()для ZipFile, созданного в режиме'r', или для закрытого ZipFile вызовет исключениеValueError. Ранее вызывалось исключениеRuntimeError.Изменено в версии 3.14: Теперь учитывается переменная среды
SOURCE_DATE_EPOCH. Если она задана, её значение используется как временная метка изменения для файла, записываемого в ZIP-архив, вместо текущего времени.
-
ZipFile.mkdir(zinfo_or_directory, mode=511) -
Создаёт каталог внутри архива. Если zinfo_or_directory — строка, внутри архива создаётся каталог с режимом, указанным в аргументе mode. Если же zinfo_or_directory — экземпляр
ZipInfo, аргумент mode игнорируется.Архив должен быть открыт в режиме
'w','x'или'a'.Добавлено в версии 3.11.
Также доступны следующие атрибуты данных:
-
ZipFile.filename -
Имя ZIP-файла.
-
ZipFile.debug -
Уровень подробности отладочного вывода. Может принимать значения от
0(по умолчанию, без вывода) до3(максимальный объём вывода). Отладочная информация записывается вsys.stdout.
Объекты Path
-
class zipfile.Path(root, at='') -
Создаёт объект Path из ZIP-файла
root(которым может быть экземплярZipFileилиfile, подходящий для передачи конструкторуZipFile).atзадаёт расположение этого Path в ZIP-файле, например «dir/file.txt», «dir/» или «». По умолчанию используется пустая строка, обозначающая корневой каталог.Примечание
Класс
Pathне проверяет и не очищает имена файлов в ZIP-архиве. В отличие от методовZipFile.extract()иZipFile.extractall(), ответственность за проверку или очистку имён файлов во избежание уязвимостей обхода каталогов (например, абсолютных путей или путей с компонентами «..») лежит на вызывающем коде. При работе с ненадёжными архивами рассмотрите возможность разрешения имён файлов с помощьюos.path.abspath()и проверки их соответствия целевому каталогу с помощьюos.path.commonpath().
Объекты Path предоставляют следующие возможности объектов pathlib.Path:
Объекты Path можно обходить с помощью оператора / или joinpath.
-
Path.name -
Последний компонент пути.
-
Path.open(mode='r', *, pwd, **) -
Вызывает
ZipFile.open()для текущего пути. Позволяет открывать файл для чтения или записи, в текстовом или двоичном режиме с поддержкой режимов «r», «w», «rb», «wb». Позиционные и именованные аргументы передаются вio.TextIOWrapperпри открытии в текстовом режиме и игнорируются в противном случае.pwd— это параметрpwdдляZipFile.open().Изменено в версии 3.9: Добавлена поддержка текстового и двоичного режимов для open. Режим по умолчанию теперь текстовый.
Изменено в версии 3.11.2: Параметр
encodingможно передать как позиционный аргумент, не вызываяTypeError, как и в версии 3.9. В коде, совместимом с непатченными версиями 3.10 и 3.11, все аргументыio.TextIOWrapper, включаяencoding, необходимо передавать как именованные.
-
Path.iterdir() -
Перечисляет дочерние элементы текущего каталога.
-
Path.is_dir() -
Возвращает
True, если текущий контекст ссылается на каталог.
-
Path.is_file() -
Возвращает
True, если текущий контекст ссылается на файл.
-
Path.is_symlink() -
Возвращает
True, если текущий контекст ссылается на символическую ссылку.Добавлено в версии 3.12.
Изменено в версии 3.13: Ранее
is_symlinkвсегда возвращалFalse.
-
Path.exists() -
Возвращает
True, если текущий контекст ссылается на файл или каталог в ZIP-файле.
-
Path.suffix -
Последняя часть конечного компонента, отделённая точкой, если она есть. Обычно её называют расширением файла.
Добавлено в версии 3.11: Добавлено свойство
Path.suffix.
-
Path.stem -
Последний компонент пути без суффикса.
Добавлено в версии 3.11: Добавлено свойство
Path.stem.
-
Path.suffixes -
Список суффиксов пути, обычно называемых расширениями файлов.
Добавлено в версии 3.11: Добавлено свойство
Path.suffixes.
-
Path.read_text(*, **) -
Читает текущий файл как текст в кодировке Юникод. Позиционные и именованные аргументы передаются в
io.TextIOWrapper(за исключениемbuffer, который подразумевается контекстом).Изменено в версии 3.11.2: Параметр
encodingможно передать как позиционный аргумент, не вызываяTypeError, как и в версии 3.9. В коде, совместимом с непатченными версиями 3.10 и 3.11, все аргументыio.TextIOWrapper, включаяencoding, необходимо передавать как именованные.
-
Path.read_bytes() -
Читает текущий файл как байты.
-
Path.joinpath(*other) -
Возвращает новый объект Path, к которому добавлен каждый из аргументов other. Следующие варианты эквивалентны:
>>> Path(...).joinpath('child').joinpath('grandchild') >>> Path(...).joinpath('child', 'grandchild') >>> Path(...) / 'child' / 'grandchild'Изменено в версии 3.10: До версии 3.10
joinpathне был документирован и принимал ровно один параметр.
Проект zipp предоставляет обратные порты последних возможностей объектов Path для более старых версий Python. Используйте zipp.Path вместо zipfile.Path, чтобы раньше получить доступ к изменениям.
Объекты 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 -
Время и дата последнего изменения элемента архива. Это кортеж из шести значений, представляющих поля «время последнего изменения файла» и «дата последнего изменения файла» из центрального каталога ZIP-файла.
Кортеж содержит:
Индекс
Значение
0Год (>= 1980)
1Месяц (нумерация с единицы)
2День месяца (нумерация с единицы)
3Часы (нумерация с нуля)
4Минуты (нумерация с нуля)
5Секунды (нумерация с нуля)
Примечание
Формат ZIP поддерживает несколько полей временных меток в разных местах (центральный каталог, дополнительные поля для систем NTFS/UNIX и т. д.). Этот атрибут возвращает именно временную метку из центрального каталога. Формат временной метки центрального каталога в ZIP-файлах не поддерживает даты ранее 1980 года. Некоторые форматы дополнительных полей (например, временные метки UNIX) могут представлять более ранние даты, но этот атрибут возвращает только временную метку центрального каталога.
Временная метка центрального каталога интерпретируется как местное время, а не время UTC, чтобы соответствовать поведению других инструментов для работы с ZIP-файлами.
-
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-файл допустимым.
Проблемы при распаковке
Распаковка в модуле zipfile может завершиться ошибкой по некоторым из перечисленных ниже причин.
Причины, связанные с самим файлом
Распаковка может завершиться ошибкой из-за неверного пароля, несовпадения контрольной суммы CRC, неверного формата ZIP или неподдерживаемого метода сжатия или шифрования.
Ограничения файловой системы
Превышение ограничений разных файловых систем может привести к ошибке распаковки. К таким ограничениям относятся допустимые символы в записях каталогов, длина имени файла, длина пути, размер отдельного файла, количество файлов и т. д.
Ограничения ресурсов
Нехватка памяти или места на диске может привести к ошибке распаковки. Например, ZIP-бомбы (также известные как ZIP bomb) могут воздействовать на библиотеку zipfile и привести к исчерпанию места на диске.
Прерывание
Прерывание распаковки, например при нажатии Control-C или принудительном завершении процесса распаковки, может привести к неполной распаковке архива.
Поведение распаковки по умолчанию
Незнание поведения распаковки по умолчанию может привести к неожиданным результатам. Например, при повторном извлечении одного и того же архива файлы перезаписываются без предупреждения.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/zipfile.html