Содержание страницы
zipfile – Работа с ZIP-архивами¶zipfile – Work with ZIP archives
Исходный код: 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 objects.
- 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 objects.Изменено в версии 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_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
Документация по формату ZIP-файлов от Фила Каца, создателя формата и используемых алгоритмов.
- Домашняя страница Info-ZIP
Информация о программах для работы с ZIP-архивами и библиотеках для разработки проекта Info-ZIP.
Объекты ZipFile¶ZipFile objects
- 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, когда размер zip-файла превышает 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: временная метка также устанавливается на предельное значение.Если режим равен
'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 code page (по умолчанию) или 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 переопределит конструктор, если указан.Примечание
При передаче экземпляра
ZipInfoв качестве параметра zinfo_or_arcname используемый метод сжатия будет тем, который указан в элементе 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.12.
- ZipFile.remove(zinfo_or_arcname)¶
Удаляет запись элемента из центрального каталога архива. zinfo_or_arcname может быть полным путём к элементу или экземпляром
ZipInfo. Если несколько элементов имеют один и тот же полный путь и путь задан строкой, будет удалён только один из них, причём какой именно – не определено; полагаться на это не следует. Передайте конкретный экземплярZipInfoдля удаления определённого элемента.Архив должен быть открыт с режимом
'w','x'или'a'.Возвращает удалённый экземпляр
ZipInfo.Вызов
remove()на закрытом ZipFile вызовет исключениеValueError.Примечание
Этот метод удаляет только запись элемента из центрального каталога, делая её недоступной для большинства инструментов. Локальная запись файла элемента, включая содержимое и метаданные, остаётся в архиве и всё ещё может быть восстановлена с помощью криминалистических средств. После этого вызовите
repack(), чтобы удалить локальную запись файла и освободить место; передайте возвращённый экземплярZipInfoвrepack(), чтобы данные были гарантированно удалены независимо от того, как была записана запись.Добавлено в версии 3.16.0a0 (не выпущено).
- ZipFile.repack(removed=None, *, strict_descriptor=True[, chunk_size])¶
Перезаписывает архив для удаления неиспользуемых локальных записей файлов, уменьшая его размер. Архив должен быть открыт в режиме
'a'.Если передан removed, это должна быть последовательность объектов
ZipInfo, представляющих недавно удалённые элементы; будут удалены только соответствующие им локальные записи файлов. В противном случае архив сканируется для поиска и удаления локальных записей файлов, на которые больше нет ссылок в центральном каталоге.Передача removed – самый надёжный способ освободить место: соответствующие локальные записи файлов находятся непосредственно в центральном каталоге и удаляются независимо от того, как они были записаны, тогда как сканирование, используемое при отсутствии removed, может оставить некоторые записи на месте (см. strict_descriptor ниже). Чтобы удалить элементы и освободить их место за один шаг:
with ZipFile('spam.zip', 'a') as myzip: removed = [myzip.remove(name) for name in ('ham.txt', 'eggs.txt')] myzip.repack(removed)
При сканировании strict_descriptor управляет обработкой записей, записанных с неподписанным дескриптором данных. Дескриптор данных – это необязательная запись, содержащая CRC и размеры записи; она хранится сразу после данных записи. Она используется, когда архив записывается в непозиционируемый поток, и является подписанным, если начинается с сигнатуры-маркера, или неподписанным в противном случае. Неподписанные дескрипторы объявлены устаревшими в PKZIP Application Note начиная с версии 6.3.0 (выпущенной в 2006 году) и записываются только некоторыми устаревшими утилитами; подписанные дескрипторы (записываемые Python и другими современными инструментами) всегда обнаруживаются. Когда strict_descriptor равен true (по умолчанию), обнаруживаются только подписанные дескрипторы данных, поэтому запись без ссылки, записанная с неподписанным дескриптором, не обнаруживается, и её место не освобождается при сканировании. Установка
strict_descriptor=Falseдополнительно обнаруживает неподписанные дескрипторы, ценой значительного замедления сканирования – в худшем случае в 100–1000 раз, что может использоваться как вектор отказа в обслуживании для ненадёжных входных данных. Это не влияет на записи без дескриптора данных и не требуется, если указан removed.chunk_size может указываться для управления размером буфера при перемещении данных записи (по умолчанию 1 МиБ).
Вызов
repack()на закрытом ZipFile вызовет исключениеValueError.Примечание
Алгоритм сканирования основан на эвристике и предполагает, что ZIP-файл имеет нормальную структуру, например, записи локальных файлов хранятся последовательно, без перекрытия или перемежающихся двоичных данных. Предшествующие двоичные данные, такие как заглушка самораспаковывающегося архива, распознаются и сохраняются, если только они случайно не содержат байты, которые по нескольким параметрам совпадают с корректной записью локального файла – крайне редкий случай. Встроенные ZIP-нагрузки также обрабатываются корректно, если они следуют нормальной структуре. Однако алгоритм не гарантирует корректность или безопасность для ненадёжных или специально сформированных входных данных. Обычно рекомендуется указывать аргумент removed для повышения надёжности и производительности.
Добавлено в версии 3.16.0a0 (не выпущено).
Также доступны следующие атрибуты данных:
- ZipFile.filename¶
Имя ZIP-файла.
- ZipFile.debug¶
Уровень отладочного вывода. Может быть установлен от
0(по умолчанию, без вывода) до3(максимальный вывод). Отладочная информация записывается вsys.stdout.
Объекты Path¶Path objects
- 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(*, **)¶
Читает текущий файл как текст в кодировке Unicode. Позиционные и именованные аргументы передаются в
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 objects
Конструктор 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 # Имя верхнего уровня test/__init__.pyc # Каталог пакета test/testall.pyc # Модуль test.testall test/bogus/__init__.pyc # Каталог подпакета test/bogus/myfile.pyc # Подмодуль test.bogus.myfile
Изменено в версии 3.4: Добавлен параметр filterfunc.
Изменено в версии 3.6.2: Параметр pathname теперь принимает объект, подобный пути.
Изменено в версии 3.7: Рекурсия сортирует записи каталога.
Объекты ZipInfo¶ZipInfo objects
Экземпляры класса 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Месяц (начиная с 1)
2День месяца (начиная с 1)
3Часы (начиная с 0)
4Минуты (начиная с 0)
5Секунды (начиная с 0)
Примечание
Формат ZIP поддерживает несколько полей временных меток в разных местах (центральный каталог, дополнительные поля для систем NTFS/UNIX и т.д.). Данный атрибут возвращает метку времени именно из центрального каталога. Формат временной метки центрального каталога в ZIP-файлах не поддерживает метки до 1980 года. Хотя некоторые форматы дополнительных полей (например, метки UNIX) могут представлять более ранние даты, этот атрибут возвращает только метку из центрального каталога.
Временная метка центрального каталога интерпретируется как местное время, а не UTC, чтобы соответствовать поведению других zip-инструментов.
- ZipInfo.compress_type¶
Тип сжатия для элемента архива.
- 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¶
Размер несжатого файла.
Интерфейс командной строки¶Command-line interface
Модуль 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
Параметры командной строки¶Command-line options
Подводные камни распаковки¶Decompression pitfalls
Извлечение в модуле zipfile может завершиться неудачей из-за некоторых подводных камней, перечисленных ниже.
Проблемы, связанные с файлом¶From file itself
Распаковка может не удаться из-за неверного пароля, несовпадения контрольной суммы CRC, неверного формата ZIP, неподдерживаемого метода сжатия или шифрования.
Ограничения файловой системы¶File system limitations
Превышение ограничений разных файловых систем может привести к сбою распаковки. Например, допустимые символы в записях каталогов, длина имени файла, длина полного пути, размер отдельного файла, количество файлов и т.д.
Ограничения ресурсов¶Resources limitations
Нехватка памяти или дискового пространства может привести к сбою распаковки. Например, бомбы распаковки (также известные как ZIP-бомбы) применимы к библиотеке zipfile и могут вызвать исчерпание дискового пространства.
Прерывание¶Interruption
Прерывание в процессе распаковки, например нажатие Control-C или завершение процесса распаковки, может привести к неполной распаковке архива.
Действия по умолчанию при извлечении¶Default behaviors of extraction
Незнание действий по умолчанию при извлечении может привести к неожиданным результатам распаковки. Например, при повторном извлечении одного и того же архива файлы перезаписываются без запроса.