Шаг 252.
Основы языка Python.
Сжатие данных. Работа с архивами ZIP (окончание)
На этом шаге мы рассмотрим свойства и методы класса ZipFile.
Теперь рассмотрим методы и атрибуты класса ZipFile.
- write (<Имя файла>[, arcname=<Имя, которое он будет иметь в архиве>][, compress_type=None]) - добавляет в
архив файл с указанным именем. Параметр arcname задает имя, которое файл примет, будучи помещенным в архив, - если он не указан,
файл сохранит свое оригинальное имя. Параметр compress_type задает алгоритм сжатия - если он не указан, будет использован алгоритм,
заданный при открытии самого архива. Примеры:
>>> # Добавляем в архив файл doc.doc
>>> f.write ("doc.doc")
>>> # Добавляем в архив файл doc2.doc под именем newdoc.doc
>>> f.write ("doc2.doc", arcname = "newdoc.doc")
- writestr (<Имя файла>, <Данные>[, compress_type=Nane]) - добавляет в архив произвольные данные в виде
файла с указанным именем:
>>> # Считываем содержимое файла text.txt
>>> f2 = open ("text.txt", mode = "r")
>>> s = f2.read()
>>> # Добавляем прочитанные данные в архив под именем textual.txt
>>> f.writestr ("textual.txt", s)
>>> f2.close ()
- close () - закрывает архивный файл:
- getinfo (<Имя файла>) - возвращает сведения о хранящемся в архиве файле с указанным именем. Эти сведения представляются в
виде объекта класса ZipInfo, объявленного в модуле zipfile и поддерживающего следующие полезные нам атрибуты:
- filename - имя файла;
- filesize - размер изначального (несжатого) файла;
- datetime - дата и время последнего изменения файла. Представляется в виде кортежа из шести элементов: года, номера месяца (от 1 до 12),
числа (от 1 до 31), часов (от 0 до 23), минут (от 0 до 59) и секунд (от 0 до 59);
- compress_size - размер файла в сжатом виде;
- compress_type - алгоритм сжатия;
- CRC - 32-разрядная контрольная сумма;
- comment - комментарий к файлу;
- create_system - операционная система, в которой был создан архив;
- create_version - версия архиватора, в которой был создан архив;
- extract_version - версия архиватора, необходимая для распаковки архива.
Если файл с заданным именем отсутствует в архиве, возбуждается исключение KeyError. Пример:
>>> f = zipfile.ZipFile("test.zip", mode="r", compression = zipfile.ZIP_DEFLATED)
>>> gf = f.getinfo ("doc.doc")
>>> gf.filename, gf.file_size, gf.compress_size
('doc.doc', 20992, 6928)
>>> gf.date_time
(1998, 2, 26, 16, 37, 38)
- infolist () - возвращает сведения обо всех содержащихся в архиве файлах в виде списка объектов класса ZipInfo:
>>> for i in f.infolist (): print(i.filename, end = " ")
doc.doc newdoc.doc textual.txt
- namelist () - возвращает список с именами хранящихся в архиве файлов:
>>> f.namelist()
['doc.doc', 'newdoc.doc', 'textual.txt']
- extract (<Файл>[, path=None] [, pwd=None]) - распаковывает из архива указанный файл, который может быть задан в виде имени
или объекта класса ZipInfo. Параметр path сообщает архиватору путь, по которому должен быть распакован файл, - если он
не указан, файл будет сохранен там же, где находится сам архив. Параметр pwd задает пароль для распаковки файла, если таковой требуется.
В качестве результата возвращается полный путь к распакованному файлу. Примеры:
>>> # Распаковываем файл doc.doc, сведения о котором хранятся
>>> # в переменной gf
>>> f .extract (gf)
'H:\\Python34\\doc.doc'
>>> # Распаковываем файл newdoc.doc в папку h:\work
>>> f.extract ("newdoc.doc", path = r'h:\work')
'h:\\work\\newdoc.doc'
- extractall ([path=None] [, members=None] [, pwd=None]) - распаковывает сразу несколько или даже все файлы из архива. Параметр members
задает список имен файлов, которые должны быть распакованы, - если он не указан, будут распакованы все файлы. Назначение параметров path и pwd
рассмотрено в описании метода extract(). Примеры:
>>> # Распаковываем все файлы
>>> f.extractall ()
>>> # Распаковываем лишь файлы doc.doc и newdoc.doc в папку h:\work
>>> f.extractall (path = r'h:\work', members = ["doc.doc", "newdoc.doc"])
- open (<Файл>[, pwd=None]) - открывает хранящийся в архиве файл для чтения. Файл может быть задан либо в виде имени,
либо как объект класса ZipInfo. Результатом, возвращенным методом, станет объект класса ZipExtFile, поддерживающий методы read(),
readline(), readlines(), знакомые нам по 246 шагу, а также итерационный протокол. Вот пример открытия файла textual.txt, хранящегося
в архиве, и записи его содержимого в файл newtext.txt:
>>> d = f.open("textual.txt")
>>> f2 = open("newtext.txt", mode = "wb")
>>> f2.write (d.read())
30311
>>> f2.close()
- read (<Имя файла>, pwd=None) - возвращает содержимое хранящегося в архиве файла с указанным именем. Для примера
перепишем приведенный ранее код:
>>> d = f.read ("textual.txt")
>>> f2 = open ("newtext.txt", mode = "wb")
>>> f2.write (d)
30311
>>> f2.close ()
- setpassword (<Пароль>) - задает пароль по умолчанию для распаковки файлов;
- testzip() - выполняет проверку целостности архива. Возвращает None, если архив не поврежден, или имя первого встретившегося ему сбойного файла;
- comment - позволяет получить или задать комментарий к архиву. В качестве комментария может выступать строка длиной не более 65535 байтов.
Более длинные строки автоматически сокращаются при закрытии архива.
В модуле zipfile также определена функция is_zipfile (<Имя файла>). Она возвращает True, если файл с переданным
ей именем является архивом ZIP, и False - в противном случае. Примеры:
>>> zipfile.is_zipfile("test.zip")
True
>>> zipfile.is_zipfile ("doc.doc")
False
При обработке файлов ZIP могут возникнуть исключения следующих классов (все они объявлены в модуле zipfile):
- BadZipFile - либо архив поврежден, либо это вообще не ZIP-архив;
- LargeZipFile - слишком большой архив ZIP. Обычно возникает, когда архив создается
вызовом конструктора класса ZipFile с параметром allowZip64, имеющим значение
False, и размер получившегося архива в процессе работы становится больше 2 Гбайт.
На следующем шаге мы рассмотрим работу с архивами TAR.
Предыдущий шаг
Содержание
Следующий шаг