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
должен быть кортежем, содержащим шесть полей, которые описывают время последней модификации файла.Большинству пользователей не нужно создавать их, а использовать только те, которые созданы этим модулем.
zipfile.ZipInfo
:ZipInfo
для файла из файловой системы zipfile.ZipInfo.from_file()
.ZipInfo
: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
.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
,