zipfile
— Работа с ZIP-архивами¶
Источник: Lib/zipfile/
Формат файлов ZIP - это распространенный стандарт архивирования и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и списывания ZIP-файлов. Любое расширенное использование этого модуля потребует понимания формата, как определено в PKZIP Application Note.
В настоящее время этот модуль не работает с многодисковыми ZIP-файлами. Он может работать с ZIP-файлами, использующими расширения ZIP64 (то есть с ZIP-файлами размером более 4 Гб). Он поддерживает расшифровку зашифрованных файлов в ZIP-архивах, но в настоящее время не может создать зашифрованный файл. Расшифровка происходит крайне медленно, так как она реализована на родном языке Python, а не C.
Модуль определяет следующие элементы:
- exception zipfile.BadZipFile¶
Ошибка, возникающая при обнаружении плохих ZIP-файлов.
Added in version 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
.Added in version 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: Атрибут public
compress_level
был добавлен для раскрытия ранее защищенного_compresslevel
. Старое защищенное имя продолжает работать как свойство для обратной совместимости.
- zipfile.is_zipfile(filename)¶
Возвращает
True
, если filename является действительным ZIP-файлом на основе его магического номера, в противном случае возвращаетFalse
. filename также может быть файлом или файлоподобным объектом.Изменено в версии 3.1: Поддержка файлов и файлоподобных объектов.
- zipfile.ZIP_STORED¶
Числовая константа для несжатого члена архива.
- zipfile.ZIP_DEFLATED¶
Числовая константа для обычного метода сжатия ZIP. Для этого требуется модуль
zlib
.
- zipfile.ZIP_BZIP2¶
Числовая константа для метода сжатия BZIP2. Для этого требуется модуль
bz2
.Added in version 3.3.
- zipfile.ZIP_LZMA¶
Числовая константа для метода сжатия LZMA. Для этого требуется модуль
lzma
.Added in version 3.3.
Примечание
С 2001 года спецификация формата ZIP включает поддержку сжатия bzip2, а с 2006 года - сжатия LZMA. Однако некоторые инструменты (включая старые версии Python) не поддерживают эти методы сжатия и могут либо вообще отказаться обрабатывать ZIP-файл, либо не извлечь отдельные файлы.
См.также
- PKZIP Application Note
Документация по формату файлов ZIP от Фила Каца, создателя формата и используемых алгоритмов.
- Info-ZIP Home Page
Информация о программах и библиотеках разработки 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 может быть путем к файлу (строкой), файлоподобным объектом или path-like object.
Параметр mode должен быть
'r'
для чтения существующего файла,'w'
для усечения и записи нового файла,'a'
для добавления к существующему файлу или'x'
для создания и записи исключительно нового файла. Если mode имеет значение'x'
и file ссылается на существующий файл, будет вызвана ошибкаFileExistsError
. Если mode имеет значение'a'
и file ссылается на существующий ZIP-файл, то к нему добавляются дополнительные файлы. Если file не ссылается на ZIP-файл, то к файлу будет добавлен новый ZIP-архив. Это предназначено для добавления ZIP-архива к другому файлу (например,python.exe
). Если mode имеет значение'a'
и файл вообще не существует, он создается. Если mode имеет значение'r'
или'a'
, файл должен быть доступен для поиска.compression - это метод сжатия ZIP, который будет использоваться при записи архива, и должен быть
ZIP_STORED
,ZIP_DEFLATED
,ZIP_BZIP2
илиZIP_LZMA
; нераспознанные значения приведут к появлению сообщенияNotImplementedError
. Если указаны значенияZIP_DEFLATED
,ZIP_BZIP2
илиZIP_LZMA
, но соответствующий модуль (zlib
,bz2
илиlzma
) недоступен, будет вызвано сообщениеRuntimeError
. По умолчанию используетсяZIP_STORED
.Если allowZip64 имеет значение
True
(по умолчанию), zipfile будет создавать ZIP-файлы, использующие расширения ZIP64, если размер zip-файла превышает 4 ГБ. Если значениеfalse
zipfile
будет возникать исключение, когда ZIP-файл будет требовать расширения ZIP64.Параметр compresslevel определяет уровень сжатия, который будет использоваться при записи файлов в архив. При использовании
ZIP_STORED
илиZIP_LZMA
он не имеет значения. При использованииZIP_DEFLATED
принимаются целые числа от0
до9
(см.zlib
для дополнительной информации). При использованииZIP_BZIP2
принимаются целые числа от1
до9
(см.bz2
для получения дополнительной информации).Аргумент 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 принимает значение path-like object.
Изменено в версии 3.7: Добавьте параметр compresslevel.
Изменено в версии 3.8: Параметр strict_timestamps только для ключевого слова.
Изменено в версии 3.11: Добавлена поддержка указания кодировки имени члена для чтения метаданных в заголовках каталогов и файлов zip-файла.
- 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())
При режиме
'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
для чтения сжатых текстовых файлов в режиме universal newlines.Изменено в версии 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
.Возвращает созданный нормализованный путь (каталог или новый файл).
Примечание
Если имя файла-члена представляет собой абсолютный путь, то drive/UNC sharepoint и ведущие (обратные) косые черты будут удалены, например:
///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 принимает значение path-like object.
- 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 принимает значение path-like object.
- 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
, приведет к ошибке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
.
- ZipFile.mkdir(zinfo_or_directory, mode=511)¶
Создать каталог внутри архива. Если zinfo_or_directory - строка, то внутри архива создается каталог с режимом, указанным в аргументе mode. Если же zinfo_or_directory является экземпляром
ZipInfo
, то аргумент mode игнорируется.Архив должен быть открыт в режиме
'w'
,'x'
или'a'
.Added in version 3.11.
Также доступны следующие атрибуты данных:
- ZipFile.filename¶
Имя файла ZIP.
- ZipFile.debug¶
Уровень используемого отладочного вывода. Этот параметр может быть установлен в диапазоне от
0
(по умолчанию, без вывода) до3
(максимальный вывод). Отладочная информация записывается вsys.stdout
.
Объекты пути¶
- class zipfile.Path(root, at='')¶
Создайте объект Path из
root
zip-файла (который может быть экземпляромZipFile
илиfile
, подходящим для передачи конструкторуZipFile
).at
указывает местоположение этого пути в zip-файле, например, „dir/file.txt“, „dir/“ или „“. По умолчанию - пустая строка, указывающая на корень.
Объекты Path раскрывают следующие возможности объектов pathlib.Path
:
Объекты пути обходятся с помощью оператора /
или joinpath
.
- Path.name¶
Последний компонент пути.
- Path.open(mode='r', *, pwd, **)¶
Вызывает
ZipFile.open()
по текущему пути. Позволяет открывать путь для чтения или записи, в текстовом или двоичном виде с помощью поддерживаемых режимов: „r“, „w“, „rb“, „wb“. Позиционные и ключевые аргументы передаются вio.TextIOWrapper
при открытии как текст и игнорируются в противном случае.pwd
является параметромpwd
дляZipFile.open()
.Изменено в версии 3.9: Добавлена поддержка текстового и бинарного режимов для открытия. Режим по умолчанию теперь текстовый.
Изменено в версии 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.exists()¶
Возвращает
True
, если текущий контекст ссылается на файл или каталог в zip-файле.
- Path.suffix¶
Последняя часть конечного компонента, разделенная точками, если таковая имеется. Обычно это называется расширением файла.
Added in version 3.11: Добавлено свойство
Path.suffix
.
- Path.stem¶
Последний компонент пути без суффикса.
Added in version 3.11: Добавлено свойство
Path.stem
.
- Path.suffixes¶
Список суффиксов пути, обычно называемых расширениями файлов.
Added in version 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 с каждым из других аргументов. Следующие аргументы эквивалентны:
>>> Path(...).joinpath('child').joinpath('grandchild') >>> Path(...).joinpath('child', 'grandchild') >>> Path(...) / 'child' / 'grandchild'
Изменено в версии 3.10: До версии 3.10 функция
joinpath
была недокументированной и принимала ровно один параметр.
Проект zipp предоставляет бэкпорты новейшей функциональности объектов пути для старых версий Python. Используйте zipp.Path
вместо zipfile.Path
для раннего доступа к изменениям.
Объекты PyZipFile¶
Конструктор PyZipFile
принимает те же параметры, что и конструктор ZipFile
, и один дополнительный параметр, optimize.
- class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)¶
Изменено в версии 3.2: Добавлен параметр оптимизировать.
Изменено в версии 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 возвращает значение false, то путь не будет добавлен, а если это каталог, то его содержимое будет проигнорировано. Например, если все наши тестовые файлы находятся в каталогах
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 принимает значение path-like object.
Изменено в версии 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, при этом временная метка также устанавливается на предельное значение.Added in version 3.6.
Изменено в версии 3.6.2: Параметр filename принимает значение path-like object.
Изменено в версии 3.8: Добавлен параметр strict_timestamps, предназначенный только для ключевых слов.
Экземпляры имеют следующие методы и атрибуты:
- ZipInfo.is_dir()¶
Возвращает
True
, если данный член архива является каталогом.При этом используется имя записи: каталоги всегда должны заканчиваться на
/
.Added in version 3.6.
- ZipInfo.filename¶
Имя файла в архиве.
- ZipInfo.date_time¶
Время и дата последней модификации члена архива. Это кортеж из шести значений:
Индекс
Значение
0
Год (>= 1980)
1
Месяц (на основе одного)
2
День месяца (на основе одного)
3
Часы (на основе нуля)
4
Минуты (на основе нуля)
5
Секунды (на основе нуля)
Примечание
Формат файлов ZIP не поддерживает временные метки до 1980 года.
- ZipInfo.compress_type¶
Тип сжатия для члена архива.
- ZipInfo.extra¶
Данные поля расширения. В PKZIP Application Note содержатся некоторые комментарии по внутренней структуре данных, содержащихся в этом объекте
bytes
.
- ZipInfo.create_system¶
Система, создавшая архив ZIP.
- ZipInfo.create_version¶
Версия PKZIP, создающая ZIP-архив.
- ZipInfo.extract_version¶
Версия PKZIP, необходимая для извлечения архива.
- ZipInfo.reserved¶
Должно быть равно нулю.
- ZipInfo.flag_bits¶
Биты флага ZIP.
- ZipInfo.volume¶
Номер тома заголовка файла.
- ZipInfo.internal_attr¶
Внутренние атрибуты.
- ZipInfo.external_attr¶
Атрибуты внешних файлов.
- ZipInfo.header_offset¶
Байт смещения к заголовку файла.
- ZipInfo.CRC¶
CRC-32 несжатого файла.
- ZipInfo.compress_size¶
Размер сжатых данных.
- ZipInfo.file_size¶
Размер несжатого файла.
Интерфейс командной строки¶
Модуль zipfile
предоставляет простой интерфейс командной строки для работы с архивами ZIP.
Если вы хотите создать новый ZIP-архив, укажите его имя после опции -c
, а затем перечислите имена файлов, которые должны быть включены:
$ python -m zipfile -c monty.zip spam.txt eggs.txt
Передача каталога также допустима:
$ python -m zipfile -c monty.zip life-of-brian_1979/
Если вы хотите распаковать ZIP-архив в указанную директорию, используйте опцию -e
:
$ python -m zipfile -e monty.zip target-dir/
Чтобы получить список файлов в ZIP-архиве, используйте параметр -l
:
$ python -m zipfile -l monty.zip
Параметры командной строки¶
Подводные камни декомпрессии¶
Извлечение в модуле zipfile может закончиться неудачей из-за некоторых подводных камней, перечисленных ниже.
Из самого файла¶
Распаковка может завершиться неудачей из-за неправильного пароля / контрольной суммы CRC / формата ZIP или неподдерживаемого метода сжатия / расшифровки.
Ограничения файловой системы¶
Превышение ограничений различных файловых систем может привести к сбою распаковки. Например, допустимые символы в записях каталогов, длина имени файла, длина имени пути, размер одного файла, количество файлов и т. д.
Ограничения ресурсов¶
Недостаток памяти или объема диска приводит к тому, что декомпрессия не удается. Например, бомбы распаковки (они же ZIP bomb) применяются к библиотеке zip-файлов, что может привести к исчерпанию дискового объема.
Прерывание¶
Прерывание процесса распаковки, например, нажатие клавиши control-C или завершение процесса распаковки, может привести к неполной распаковке архива.
Поведение по умолчанию при извлечении¶
Незнание стандартного поведения при извлечении может привести к неожиданным результатам распаковки. Например, при извлечении одного и того же архива дважды он перезаписывает файлы без запроса.