Сообщить об ошибке.

Класс ZipInfo модуля zipfile в Python

Использование объекта ZipInfo с описанием

Синтаксис:

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.

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

,