import zipfile zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))
filename='NoName' - имя файла,date_time=(1980, 1, 1, 0, 0, 0) - дата и время файла в виде кортежа.Класс ZipInfo() модуля zipfile используется для представления информации о члене архива.
Экземпляры этого класса возвращаются методами ZipFile.getinfo() и ZipFile.infolist() объекта ZipFile. Каждый объект ZipInfo хранит информацию об одном элементе ZIP-архива.
filename должно быть полным именем члена архива.date_time должен быть кортежем, содержащим шесть полей, которые описывают время последней модификации файла.Большинству пользователей не нужно создавать их, а использовать только те, которые созданы этим модулем.
Изменено в Python 3.13: Добавлен общедоступный атрибут
compress_levelдля предоставления доступа к ранее защищенному_compresslevel. Старое защищенное имя продолжает работать как свойство для обеспечения обратной совместимости.
zipfile.ZipInfo:ZipInfo для файла из файловой системы zipfile.ZipInfo.from_file().ZipInfo:zipfile.ZipInfo._for_archive() (добавлено в версии 3.14).True, если каталог ZipInfo.is_dir(),ZipInfo.filename,ZipInfo.date_time,ZipInfo.compress_type,ZipInfo.comment,ZipInfo.extra,ZipInfo.create_system,PKZIP архива ZipInfo.create_version,PKZIP для распаковки ZipInfo.extract_version,ZipInfo.reserved,ZipInfo.flag_bits,ZipInfo.volume,ZipInfo.internal_attr,ZipInfo.external_attr,ZipInfo.header_offset,ZipInfo.CRC,ZipInfo.compress_size,ZipInfo.file_size.zipfile.ZipInfo.zipfile.ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True):Метод класса zipfile.ZipInfo.from_file() создает экземпляр ZipInfo для файла в файловой системе, что бы потом добавить его в zip-архив.
Имя файла filename должно быть путем к файлу или каталогу в файловой системе.
Если указан аргумент arcname, то он используется в качестве имени файла в архиве. Если arcname не указано, то имя будет таким же, как filename, но с удалением любой буквы диска и начальных разделителей пути.
Аргумент strict_timestamps, установленный в False, позволяет архивировать файлы старше 1980-01-01 за счет установки метки времени в 1980-01-01. Аналогичное поведение происходит с файлами более ранними, чем 2107-12-31.
>>> import zipfile, os, time >>> file = 'test.csv' # структура времени файла >>> file_time_tuple = time.localtime(os.path.getmtime(file)) >>> zf_file = zipfile.ZipInfo(file, file_time_tuple).from_file(file) >>> zf_file.is_dir() # False >>> zf_file.filename # test.csv >>> zf_file.date_time # (2020, 5, 18, 13, 21, 43) >>> zf_file.compress_type # 0 >>> zf_file.compress_type = zipfile.ZIP_DEFLATED >>> zf_file.compress_type # 8 >>> zf_file.comment = b'Comment' >>> zf_file.comment # b'Comment
ZipInfo.zipfile.ZipInfo._for_archive(archive):Добавлено в версии 3.14.
Метод zipfile.ZipInfo._for_archive() разрешает атрибуты date_time, compression и внешние атрибуты в подходящие значения по умолчанию, используемые методом ZipFile.writestr().
Возвращает self для цепочного вызова.
Разъяснение:
Этот метод является внутренним и служит для подготовки объекта ZipInfo к использованию при записи в ZIP-архив. Он автоматически устанавливает:
date_time - временную метку файла (по умолчанию текущее время)compression - метод сжатия (по умолчанию ZIP_STORED или ZIP_DEFLATED)Метод возвращает self, что позволяет использовать цепочные вызовы (method chaining).
Примеры использования:
import zipfile from datetime import datetime # Базовое использование with zipfile.ZipFile('example.zip', 'w') as zf: # Создаем объект ZipInfo zip_info = zipfile.ZipInfo('myfile.txt') # Подготавливаем его для архива (устанавливаются значения по умолчанию) zip_info._for_archive(zf) # Записываем содержимое zf.writestr(zip_info, 'Содержимое файла') # С цепочным вызовом with zipfile.ZipFile('example2.zip', 'w') as zf: zip_info = zipfile.ZipInfo('myfile.txt') # Цепочка вызовов zip_info._for_archive(zf).comment = b'My comment' zf.writestr(zip_info, 'Содержимое файла') # С предварительной настройкой with zipfile.ZipFile('example3.zip', 'w') as zf: zip_info = zipfile.ZipInfo('myfile.txt') # Можно частично настроить перед подготовкой zip_info.date_time = (2024, 1, 1, 12, 0, 0) # Установить конкретную дату # _for_archive дополнит остальные атрибуты значениями по умолчанию zip_info._for_archive(zf) zf.writestr(zip_info, 'Содержимое файла')
ZipInfo.is_dir():Метод ZipInfo.is_dir() возвращает True, если этот элемент архива является каталогом.
При этом используется имя записи: каталоги всегда должны заканчиваться на символ '/'.
>>> import zipfile >>> file = 'test.csv' >>> zf_info = zipfile.ZipInfo(file) >>> zf_info.is_dir() # False
ZipInfo.filename:Атрибут ZipInfo.filename возвращает строку с именем файла в архиве.
>>> import zipfile >>> file = 'test.csv' >>> zf_info = zipfile.ZipInfo(file) >>> zf_info.filename # test.csv
ZipInfo.date_time:Атрибут ZipInfo.date_time возвращает время и дату последнего изменения элемента архива.
Это кортеж из шести значений: (year, month, day, hours, minutes, seconds).
>>> import time, os, zipfile >>> file = 'test.csv' >>> zf_info = zipfile.ZipInfo(file) >>> zf_info.date_time # (1980, 1, 1, 0, 0, 0) # структура времени файла >>> file_time_tuple = time.localtime(os.path.getmtime(file)) >>> zf_info = zipfile.ZipInfo(file, file_time_tuple).from_file(file) >>> zf_info.date_time # (2020, 5, 18, 13, 21, 43)
Примечание. Формат файла ZIP не поддерживает временные метки до 1980 года.
ZipInfo.compress_type:Атрибут ZipInfo.compress_type возвращает/устанавливает целое число обозначающее тип сжатия для члена архива.
>>> import zipfile >>> file = 'test.csv' >>> zf_info = zipfile.ZipInfo(file) >>> zf_info.compress_type # 0 >>> zf_info.compress_type = zipfile.ZIP_DEFLATED >>> zf_info.compress_type # 8
ZipInfo.comment:Атрибут ZipInfo.comment возвращает/устанавливает комментарий для отдельного члена архива в виде байтового объекта.
>>> import zipfile >>> file = 'test.csv' >>> zf_info = zipfile.ZipInfo(file) >>> zf_info.comment # '' >>> zf_info.comment = b'Comment' >>> zf_info.comment # b'Comment
ZipInfo.extra:Атрибут ZipInfo.extra расширение поля данных. Замечание по применению PKZIP содержит некоторые комментарии по внутренней структуре данных, содержащихся в этом байтовом объекте.
ZipInfo.create_system:Атрибут ZipInfo.create_system возвращает целое число обозначающее код операционной системы, которая создала ZIP архив.
>>> import zipfile >>> file = 'test.csv' >>> zf_info = zipfile.ZipInfo(file) >>> zf_info.create_system # 3
ZipInfo.create_version:Атрибут ZipInfo.create_version возвращает целое число обозначающее версию PKZIP, которая создала архив ZIP.
>>> import zipfile >>> file = 'test.csv' >>> zf_info = zipfile.ZipInfo(file) >>> zf_info.create_version # 20
ZipInfo.extract_version:Атрибут ZipInfo.extract_version возвращает целое число обозначающее версию PKZIP, которая необходима для распаковки архива.
>>> import zipfile >>> file = 'test.csv' >>> zf_info = zipfile.ZipInfo(file) >>> zf_info.extract_version # 20
ZipInfo.reserved:Атрибут ZipInfo.reserved должен быть ноль.
ZipInfo.flag_bits:Атрибут ZipInfo.flag_bits возвращает бит флагов ZIP архива.
>>> import zipfile >>> file = 'test.csv' >>> zf_info = zipfile.ZipInfo(file) >>> zf_info.flag_bits # 0
ZipInfo.volume:Атрибут ZipInfo.volume возвращает номер тома заголовка файла.
ZipInfo.internal_attr:Атрибут ZipInfo.internal_attr возвращает/устанавливает внутренние атрибуты файла/каталога в архиве.
>>> import zipfile >>> file = 'test.csv' >>> zf_info = zipfile.ZipInfo(file) >>> zf_info.internal_attr # 0 >>> zf_info.internal_attr = 0o600 << 16 >>> zf_info.internal_attr # 25165824
ZipInfo.external_attr:Атрибут ZipInfo.external_attr возвращает/устанавливает атрибуты файла/каталога архива, которые он получит после извлечения из архива.
>>> import zipfile >>> file = 'test.csv' >>> zf_info = zipfile.ZipInfo(file) >>> zf_info.external_attr # 0 >>> zf_info.external_attr = 0o650 << 16 >>> zf_info.external_attr # 27787264
ZipInfo.header_offset:Атрибут ZipInfo.header_offset возвращает смещение байта к заголовку файла.
ZipInfo.CRC:Атрибут ZipInfo.CRC возвращает CRC-32 из несжатого файла.
ZipInfo.compress_size:Атрибут ZipInfo.compress_size возвращает размер сжатого файла.
ZipInfo.file_size:Атрибут ZipInfo.file_size возвращает размер файла (несжатого) в исходном виде.
Сначала создадим архив test.zip.
import zipfile, os, glob path = '/home/docs-python/script/sql-script/' files = glob.glob(path + '**') with zipfile.ZipFile('test.zip', mode='w', \ compression=zipfile.ZIP_DEFLATED) as zf: for file in files: zf.write(file) >>> os.system('file test.zip') # test.zip: Zip archive data, at least v2.0 to extract
Пример использования объекта ZipInfo.
import zipfile with zipfile.ZipFile('test.zip') as zf: # получение объекта `ZipInfo` files_info = zf.infolist() # распечатаем всю доступную информацию # о первом элементе архива >>> print('filename =>', files_info[0].filename) # filename => home/docs-python/script/sql-script/Script-5.sql >>> print('is_dir =>', files_info[0].is_dir()) # is_dir => False >>> print('date_time =>', files_info[0].date_time) # date_time => (2019, 9, 14, 8, 7, 18) >>> print('compress_type =>', files_info[0].compress_type) # compress_type => 8 >>> print('comment =>', files_info[0].comment) # comment => b'' >>> print('extra =>', files_info[0].extra) # extra => b'' >>> print('create_system =>', files_info[0].create_system) # create_system => 3 >>> print('create_version =>', files_info[0].create_version) # create_version => 20 >>> print('extract_version =>', files_info[0].extract_version) # extract_version => 20 >>> print('flag_bits =>', files_info[0].flag_bits) # flag_bits => 0 >>> print('volume =>', files_info[0].volume) # volume => 0 >>> print('internal_attr =>', files_info[0].internal_attr) # internal_attr => 0 >>> print('external_attr =>', files_info[0].external_attr) # external_attr => 2176057344 >>> print('header_offset =>', files_info[0].header_offset) # header_offset => 0 >>> print('CRC =>', files_info[0].CRC) # CRC => 3617887675 >>> print('compress_size =>', files_info[0].compress_size) # compress_size => 893 >>> print('file_size =>', files_info[0].file_size) # file_size => 2687
Добавим в архив файл, у которого определим комментарий, а так же установим разрешение файла, которое он получит при извлечении из архива.
import zipfile, time, zlib add_file = 'test.py' with zipfile.ZipFile('test.zip', mode='a') as zf: zinfo = zipfile.ZipInfo(add_file, time.localtime()) # комментарий будет именем файла zinfo.comment = zinfo.filename.encode('utf-8') # разрешение файла при извлечении из архива zinfo.external_attr = 0o650 << 16 # читаем добавляемый файл в бинарном режиме with open(add_file, 'rb') as fp: # пишем в архив zf.writestr(zinfo, fp.read()) # читаем комментарий добавленного файла with zipfile.ZipFile('test.zip') as zf: info = zf.getinfo('test.py') print(info.comment) # b'test.py' print(info.external_attr) # 27787264
,