Работаем с zip архивами в Python

Дата публикации:29 апреля 2013 г. 19:29:03

Здравствуйте уважаемые читатели моего скромного блога! Сегодня я расскажу вам о том, как работать с zip архивами в языке программирования Python. Сразу к делу.

За что я люблю питон, так это за его богатую стандартную библиотеку, в которой найдется модуль для любой задачи, в разы упрощающей работу программиста. Для работы с zip архивами существует модуль zipfile. Про него и будет дальнейший рассказ. Для начала сделаем импорт всех функций и классов данного модуля. Пишем:

from zipfile import *

Итак, первое с чего я начну - это с проверки файла на принадлежность к архиву. Создадим руками zip архив, назовем его «123.zip», внутрь вы можете положить все, что угодно и выполним команду проверки:

is_zipfile('123.zip')

Как несложно догадаться, эта функция проверяет, является ли файл архивом или нет. Если да, то она вернет True, если нет False. В аргументе она принимает только имя файла и не более этого. Идем дальше. Следующим, что мы рассмотрим, будет класс ZipFile. Он имеет следующий синтаксис:

ZipFile(filename [, mode [, compression [, allowZip64]]])

, где filename - имя файла zip архива, в mode передается флаг. Вы можете передать в него следующие флаги: 'r' - файл будет открыт для чтения. 'w' - если файл существует, то он будет уничтожен и вместо него будет создан новый файл. 'a' - существующий файл будет открыт в режиме добавления в конец.

Аргумент compression определяет метод сжатия, который должен использоваться при записи в архив. Он принимает одно из значений: ZIP_STORED или ZIP_DEFLATED. По умолчанию используется значение ZIP_STORED. Последний аргумент allowZip64 позволяет разрешить использование расширений ZIP64, которые дают возможность создавать архивы размером больше 2 гигабайт. По умолчанию равен False.

Итак, давайте откроем наш ранее созданный архив для чтения:

z = ZipFile('123.zip', 'r')

Теперь извлечем из него что-нибудь. В моем случае, внутри архива лежит пустой текстовый файл с именем text.

z.extract('text')

Вы также можете передать вторым аргументом строку path, которая укажет куда извлечь данный файл, и если ваш архив закрыт паролем, то третим аргументом вы можете передать значения пароля.

Но иногда нам требуется сразу извлечь все файлы из архива. Для этого есть замечательный метод extractall(), синтаксис которого схож с методом extract, но определяет некоторые свои аргументы. Первым в нем стоит аргумент path, который описан выше, второй members (о нем ниже) и третий - это pwd, то есть пароль на архив.

z.extractall()

По поводу members - это подмножество списка, возвращаемого методом namelist(). Этот метод возвращает список имен элементов архива, не больше не меньше. Идем дальше.

Теперь откроем файл для чтения в архиве. Для этого есть метод open(). Он принимает имя файла в архиве и может открывать только для чтения. Вторым аргументов выступает флаг. Их несколько: 'r', 'rU' или 'U'. Последним аргументом может передаваться пароль. Обратите внимание, метод возвращает объект, который поддерживает методы read(), readline() и readlines(), а также позволяет выполнять итерации с помощью for.

f = z.open('text')

# Посмотрим, что содержит f

<zipfile.ZipExtFile object at 0x23d4710>

# Прочитаем строку из файла

f.readline()
''
# Поскольку файл пустой, метод вернул пустую строку

Теперь выведем каталог архива в поток sys.stdout.

z.printdir()
File Name                                             Modified             Size
text                                           2013-04-29 19:22:28           

Чтобы добавить файл в архив, существует метод write(). Он имеет синтаксис: write(filename, [, arcname[, compress_type]]), где filename - имя файла, arcname - имя в архиве, compress_type - метод сжатия. Он принмает те же значения, что и ZipFile(), описанный выше. Обратите внтмание, что по умолчанию используется метод сжатия, указанный в вызове ZipFile(). Архив должен быть открыт в режиме 'w' или 'a'.

И последний метод, который я рассмотрю - это close(). Он, как не сложно догадаться закрывает файл архива. Помните, что он должен вызываться перед завершением программы для того, чтобы «вытолкнуть» в zip файл оставшиеся в памяти записи.

z.close()

Об остальных функциях и классах модуля zipfile вы можете прочитать в официальной документации по языку Python. Спасибо за внимание!

Метки:zip, python, архивы