Сжатие данных. Работа с архивами TAR (окончание)

   
На этом шаге мы рассмотрим свойства и методы класса TarFile.

   
Перечислим методы и атрибуты, поддерживаемые классом TarFile и предназначенные для работы с содержимым архива.

  • add (<Имя элемента>[, arcname=<Имя, которое он будет иметь в архиве>] [, recursive=True] [, exclude=None]) - добавляет в архив элемент (файл, папку, символическую
    или жесткую ссылку) с указанным именем. Параметр arcname задает имя, которое элемент примет, будучи помещенным в архив. По умолчанию это изначальное имя элемента. Если параметру
    recursive присвоить значение False, папки будут добавляться в архив без содержащихся в них папок и файлов. По умолчанию они добавляются вместе с содержимым.

       
    Параметру exclude можно присвоить функцию, которая будет принимать один параметр - имя очередного добавляемого в архив элемента - и возвращать логическую величину. Если она равна
    True, элемент не будет добавлен в архив, если False - то будет. Причем этот элемент может как добавляться непосредственно в вызове метода add(), так и находиться в
    добавляемой папке. Примеры:

    >>> # Добавляем в архив файл doc.doc
    >>> f.add("doc.doc")
    >>> # Добавляем в архив файл doc2.doc под именем newdoc.doc
    >>> f.add("doc2.doc", arcname = "newdoc.doc")
    >>> # Добавляем в архив папку test с содержимым
    >>> f.add ("test")
    >>> # Добавляем в архив папку test2 без содержимого
    >>> f.add("test2", recursive = False)
    >>> # Добавляем в архив папку test3, исключив все временные файлы,
    >>> # что могут в ней находиться
    >>> def except_tmp(filename):
    	return filename.find(".tmp") != -1
    
    >>> f.add("test3", exclude = except_tmp)
    >>> f.close()
    
  • close () -закрывает архивный файл:
    >>> f.close()
    
  • getmember (<Имя элемента>) - возвращает объект класса TarInfo, представляющий хранящийся в архиве элемент с указанным именем. Класс TarInfo поддерживает
    следующие полезные нам атрибуты и методы:

    • name - имя элемента (файла, папки, жесткой или символической ссылки);
    • size - размер элемента в байтах;
    • mtime - время последнего изменения элемента;
    • mode - права доступа к элементу;
    • linkname - путь, на который указывает жесткая или символическая ссылка. Доступно только для элементов-ссылок;
    • isfile () и isreg () - возвращают True, если элемент является файлом;
    • isdir () - возвращает True, если элемент является папкой;
    • issym () - возвращает True, если элемент является символической ссылкой;
    • islnk () - возвращает True, если элемент является жесткой ссылкой.

    Если элемент с заданным именем отсутствует в архиве, возбуждается исключение KeyError. Примеры:

    >>> f = tarfile.open (name = "test.tar.gz")
    >>> # Получаем сведения о файле doc.doc:
    >>> ti = f.getmember("doc.doc")
    >>> ti.name, ti.size, ti.mtime, ti.isfile(), ti.isdir()
    ('doc.doc', 20992, 1010997832, True, False)
    >>> # Получаем сведения о папке test
    >>> ti = f.getmember("test")
    >>> ti.name, ti.size, ti.mtime, ti.isfile(), ti.isdir()
    ('test', 0, 1548074889, False, True)
    
  • getmembers () - возвращает сведения обо всех содержащихся в архиве элементах в виде списка объектов класса TarInfо:
    >>> for i in f.getmembers(): print (i.name, end = " ")
    
    doc.doc newdoc.doc test test/cars.gif 
    test/cartitle.jpg test2 test3 test3/im00601.png 
    

    Отметим, что возвращаются, в том числе, все файлы и папки, хранящиеся в присутствующих в архиве папках;

  • getnames () - возвращает список с именами хранящихся в архиве элементов:
    >>> f.getnames()
    ['doc.doc', 'newdoc.doc', 'test', 'test/cars.gif', 'test/cartitle.jpg', 
    'test2', 'test3', 'test3/im00601.png']
    
  • next () - возвращает следующий элемент из находящихся в архиве. Если элементов больше нет, возвращается None;
  • extract (<Элемент>[, path=""][, set_attrs=True]) - распаковывает указанный элемент, который может быть задан в виде имени или объекта класса TarInfo. Параметр
    path сообщает архиватору путь, по которому должен быть распакован элемент, - если он не указан, элемент будет сохранен там же, где находится сам архив. Если задать для
    параметра set_attrs значение False, время последнего изменения элемента и права доступа для распаковываемого элемента задаст сама операционная система, если же его
    значение - True (как по умолчанию), эти сведения будут взяты из архива. Примеры:

    >>> # Распаковываем папку test, сведения о которой хранятся
    >>> # в переменной ti
    >>> f.extract(ti)
    >>> # Распаковываем файл doc.doc в папку c:\work
    >>> f.extract ("doc.doc", path = r'c:\work')
    
  • extractall ([path="."] [, members=None]) - распаковывает сразу несколько или даже все элементы из архива. Параметр members задает список элементов, представленных
    объектами класса TarFile, которые должны быть распакованы, - если он не указан, будут распакованы все элементы. Назначение параметра path рассмотрено в описании
    метода extract(). Примеры:

    >>> # Распаковываем все файлы
    >>> f.extractall()
    >>> # Распаковываем лишь файлы doc.doc и newdoc.doc в папку c:\work
    >>> l = [f.getmember ("doc.doc"), f.getmember ("newdoc.doc")]
    >>> f.extractall (path = r'c:\work', members = l)
    
  • extractfile (<Элемент>) - открывает для чтения хранящийся в архиве элемент-файл, заданный именем или объектом класса TarFile. В качестве результата возвращается
    объект класса ExFileObject, поддерживающий методы read(), readline(), readlines(),
    знакомые нам по 246 шагу, и итерационный протокол.
    Пример открытия файла doc.doc, хранящегося в архиве, и записи его содержимого в файл doc2.doc:

    >>> d = f.extractfile ("doc.doc")
    >>> f2 = open ("doc2.doc", mode = "wb")
    >>> f2.write (d.read())
    20992
    >>> f2.close()
    

   
В модуле tarfile присутствует функция is_tarfile(<Имя файла>), возвращающая True, если файл с переданным ей именем является архивом TAR. Примеры:

>>> tarfile.is_tarfile ("test.tar.gz")
True
>>> tarfile.is_tarfile ("doc2.doc")
False

   
При обработке TAR-архивов могут возбуждаться следующие исключения (все они объявлены в модуле tarfile):

  • TarError - базовый класс для всех последующих классов исключений;
  • ReadError - либо архив поврежден, либо это вообще не архив TAR;
  • CompressionError - заданный алгоритм сжатия не поддерживается, или данные по какой-то причине не могут быть сжаты;
  • StreamError - ошибка обмена данными с файлом архива;
  • ExtractError - при распаковке данных возникла некритическая ошибка.

   Примечание.
Python также поддерживает сжатие и распаковку файлов в формате ZLIB, похожем на формат GZIP. Инструменты, используемые для этого, описаны в документации.

   
На следующем шаге мы подведем некоторые итоги.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий