Spec-Zone.ru › Python 3.14

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.3: Добавлена поддержка сжатия bzip2 и lzma.

Изменено в версии 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.

ZipFile.comment

Комментарий, связанный с ZIP-файлом, в виде объекта bytes. Если экземпляру ZipFile, созданному в режиме 'w', 'x' или 'a', назначается комментарий, его длина не должна превышать 65535 байт. Более длинные комментарии будут усечены.

Объекты 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-файл допустимым.

--metadata-encoding <encoding>

Задать кодировку имён элементов для параметров -l, -e и -t.

Добавлено в версии 3.11.

Проблемы при распаковке

Распаковка в модуле 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API