import zipfile zf = zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, \ allowZip64=True, compresslevel=None, *, \ strict_timestamps=True, metadata_encoding=None)
file
- имя ZIP-файла,mode='r'
- режим открытия ZIP-файла,compression=ZIP_STORED
- метод/алгоритм сжатия,allowZip64=True
- расширение ZIP64
,compresslevel=None
- уровень сжатия,strict_timestamps=True
- позволяет архивировать файлы старше 1980-01-01,metadata_encoding=None
- (добавлен в Python 3.11) обходной путь для устаревших реализаций (подробности ниже) Функция ZipFile()
модуля zipfile
открывает файл ZIP, где файл может быть строкой, обозначающей путь к файлу, объектом, похожем на путь или файловым объектом.
Параметр mode
должен иметь значение:
r
для чтения существующего файла, w
для усечения и записи нового файла, a
для добавления к существующему файлу x
исключительно для создания и записи нового файла. Поведение аргумента mode
в сочетании с file
:
mode='x'
и файл file
ссылается на существующий файл, будет вызвана ошибка FileExistsError
. mode='a'
и файл file
ссылается на существующий ZIP-файл, то к нему добавляются дополнительные файлы. Если файл file
не ссылается на ZIP-файл, то к нему добавляется новый ZIP-архив. Это предназначено для добавления ZIP-архива в другой файл (например python.exe
). mode='a'
, а файл file
вообще не существует, то он создается. mode
установлен как 'r'
или 'a'
, то файл должен быть доступен для чтения.Аргумент compression
- это метод сжатия ZIP, используемый при записи архива, и должен быть zipfile.ZIP_STORED
, zipfile.ZIP_DEFLATED
, zipfile.ZIP_BZIP2
или zipfile.ZIP_LZMA
. Не распознанные значения вызовут исключение NotImplementedError
. Если указан zipfile.ZIP_DEFLATED
, zipfile.ZIP_BZIP2
или zipfile.ZIP_LZMA
, но соответствующий модуль zlib
, bz2
или lzma
недоступен, возникает исключение RuntimeError
. По умолчанию используется zipfile.ZIP_STORED
.
Если значение аргумента allowZip64=True
(по умолчанию), а размер zip-файла больше 4 ГиБ, то будет создаваться ZIP-файл, который использует расширение ZIP64
. Если allowZip64=False
, то модуль zipfile
вызовет исключение, когда ZIP-файл потребует расширения ZIP64
.
Параметр compresslevel
управляет уровнем сжатия, используемым при записи файлов в архив. При использовании zlib.ZIP_STORED
или zlib.ZIP_LZMA
это не имеет никакого эффекта.
zlib.ZIP_DEFLATED
, то принимаются целые числа от 0 до 9 (подробнее смотрите zlib.compressobj()
). zlib.ZIP_BZIP2
допускаются целые числа от 1 до 9 (подробнее смотрите bz2.open
).Аргумент strict_timestamps=False
позволяет архивировать файлы старше 1980-01-01 за счет установки метки времени в 1980-01-01. Аналогичное поведение происходит с файлами более ранних, чем 2107-12-31, отметка времени также установлена на ограничение.
Если файл file
создается в режиме w
, x
или a
, а затем закрывается без добавления каких-либо файлов в архив, то создается пустой файл архива ZIP.
Класс zipfile.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 расширением.
Новое в Python 3.8: Аргумент только для ключевого слова strict_timestamps
Новое в Python 3.11: добавлена поддержка указания кодировки имени элемента для чтения метаданных в каталоге zip-файла и заголовках файлов.
Создание архива каталога с файлами. Для дополнительной информации смотрите раздел "Описание методов объекта ZipFile
".
import zipfile, os path = '/home/docs-python/script/sql-script/' file_dir = os.listdir(path) with zipfile.ZipFile('test.zip', mode='x', \ compression=zipfile.ZIP_DEFLATED) as zf: for file in file_dir: add_file = os.path.join(path, file) zf.write(add_file) >>> os.system('file test.zip') # test.zip: Zip archive data, at least v2.0 to extract
Извлечение всех файлов из архива в определенный каталог.
import zipfile, glob extract_dir = 'extract_dir' with zipfile.ZipFile('test.zip') as zf: zf.extractall(extract_dir) >>> for file in glob.glob(extract_dir + '/**', recursive=True): ... print(file) ... # home/docs-python/script/sql-script/Script-5.sql # home/docs-python/script/sql-script/Script-1.sql # home/docs-python/script/sql-script/Script-3.sql # home/docs-python/script/sql-script/procedure.sql # home/docs-python/script/sql-script/Script-2.sql # home/docs-python/script/sql-script/Script-4.sql