Шаг 254.
Основы языка Python.
Сжатие данных. Работа с архивами 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 () -закрывает архивный файл:
- 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. Инструменты, используемые для этого, описаны в документации.
На следующем шаге мы подведем некоторые итоги.
Предыдущий шаг
Содержание
Следующий шаг