понедельник, 16 марта 2009 г.

Работа с tar-файлами в Python

Автор: Adam Zajac
Содействие:
Последняя ревизия: 2007.09.08


Разрешается копировать, распространять или изменять (без изменения глав статьи, а также вставки обложек с тыльной и обратной стороны текста)данный документ, в соответствии с лицензией GNU о Свободной Документации (версия 1.2 или более поздняя версия, изданная Фондом бесплатного программного обеспечения). Копия лицензии находится по адресу http://www.gnu.org/copyleft/fdl.html.

Работа с Файлами Tar в Питоне
1. Вступление
1.a. Дополнительное чтение
2. Обучение
2.a. Добавление файлов
2.b. Информация о файле
2.c. Извлечение файлов
3. Примеры
3.a. Архивирование каталога
4. Распространение
4.a. Удаление файлов



Вступление

"tar" является форматом архивирования, который стал довольно популярным в мире open source. Его задача: связывать несколько файлов в один файл. Tar-формат разрабатывался для создания архивов на магнитной ленте. На сегодняшний день данный формат чаще всего можно встретить в использовании дистрибутивов исходного кода или в использовании резервных копий данных. В большинстве дистрибутивов Linux(в стандартной установке) имеются инструменты для создания и распаковки tar-файлов.


В стандартную библиотеку Python'а включен модуль, который позволяет легко создавать и извлекать tar-архивы. А также примеры того, как люди могли бы использовать такие функциональные возможности: как программирование обычного скрипта для резервного хранения или скрипта для создания промежуточной архивации личных проектов.

Дополнительное чтение

В данном документе имеется значительная информация о файлах tar и модуле Python'а — tarfile. В дополнение к этому документу Вы можете почитать следующие ресурсы:

Wikipedia: tar file
Python Library Reference 12.5: tarfile


Обучение

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


Добавление файлов


Изначально необходимо импортировать tarfile-модуль. Затем необходимо создать вызов объекта TarFile. Данный - объект имеет специальные функции для взаимодействия tar-файлом. В нашем случае, мы открываем файл "archive.tar.gz". Отметьте, что режим - "w:gz", который открывает файл записи с gzip сжатием. Как обычно, параметр "w" перезаписывает архив заново без сохранения предыдущих данных. Если tarfile уже существует, используйте параметр "a", чтобы добавить файлы конец архива (Заметка: Вы не можете использовать режим 'a:gz', вместо этого необходимо писать: 'a' или 'a:'.

Создание TarFile-Объекта:

>>> import tarfile
>>> tar = tarfile.open("archive.tar.gz", "w:gz")
>>> tar
Результат:<tarfile.TarFile object at 0x2af77c060990>

Добавить файлы к архиву достаточно просто. Если вы хотите записать в архив файл под другим именем, используйте опцию arcname.



Добавление файлов в архив


>>> tar.add("file.txt")
>>> tar.add("file.txt", arcname="new.txt")


Добавление директорий работает таким же образом. Отметьте, что по умолчанию каталог будет добавлен рекурсивно: каждый файл и папка внутри него будут включены. Данное поведение может быть изменено установкой параметра recursive равное False.


Добавление директории к архиву


>>> tar.add("docs/")
>>> tar.add("financial/", recursive=False)

Чтобы архив функционировал правильно, убедитесь, что Вы закрыли TarFile-объект.

Закрытие TarFile-объекта

>>> tar.close()

Информация о файле

tarfile-модуль может показать общую информацию о содержании tar-файла. Также имеется возможность получить доступ к каждому пункту объекта TarInfo. Например, функция getmembers() возвратит список всех объектов TarInfo в tar-файле:


Список объектов TarInfo


>>> import tarfile
>>> tar = tarfile.open("archive.tar.gz", "r")
>>> members = tar.getmembers()
>>> members
Результат:[<TarInfo 'text.txt' at 0x2b0b73e46a90>, <TarInfo 'text2.txt' at 0x2b0b73e46ad0>]



Объект TarInfo содержит методы запросов. Ниже представлены примеры работы с данными методами. Полный список можно найти здесь

TarInfo информация

>>> members[0].name
Результат:'text.txt'
>>> members[0].isfile()
Результат:True

Извлечение Файлов

Извлечение содержимого архива, очень простой процесс. Извлечение всего tar-файла, осуществляется с помощью функции extractall(). Данная функция извлечет файл в текущей рабочей директории. Также можно определить путь для разархивирования файлов в другом месте.


Извлечение полного содержимого tar-файла


>>> import tarfile
>>> tar = tarfile.open("archive.tar.gz", "r")
>>> tar.extractall()
>>> tar.extractall(r"c:\temp")


Когда необходимо извлечь определенные файлы, используйте функцию extract()


Извлечение единственного файла из tar-архива


>>> import tarfile
>>> tar = tarfile.open("archive.tar.gz", "r:gz")
>>> tar.extract("text.txt")
>>> tar.extract("text.txt", r"c:\temp")


Также Вы должны знать, что извлеченеие файлов из архива может повлият на безопасность ваших данных. А именно, tar-архив может быть разработан, так что при извлечении из него, он может переписать файлы находящиеся за пределами текущего рабочего каталога (/etc/passwd, например). Никогда не извлекайте данные из tar-архива как root-пользователь, если Вы не доверяете этому архиву.



Примеры

Архивирование Директории

archiver.py

import os
import tarfile

directory = os.getcwd()
contents = os.listdir(directory)
tar = tarfile.open("backup.tar.gz", "w:gz")

for item in contents:
tar.add(item)

tar.close()

Распространение
Удаление файлов

К сожалению tarfile-модуль не содержит функции для удаления элементов из архива. Предполагается, что виной тому были лентопротяжные устройства, у которых не было возможности, двигаться в прямом и обратном направлении для того чтобы считать файл из архива, и затем удалить его. (пост под ссылкой объясняет более подробно почему не было необходимости удаления файлов из tar-архива). Однако, другие программные средства имеют возможность удалять данные из tar-архива.


Следующий код использует популярные GNU tar-программы, который идут с большинством дистрибутивов Linux. В родной документации tar программы имеется флаг "--delete" который используется для удаления файлов из архива, заметьте, что они предупреждают, чтобы не использовать его на фактическом лентопротяжном устройстве. Естественно использование внешней программы делает код гораздо менее переносным, хотя данный способ является подходящим для создания личных скриптов.


Удаление элемента из архива с помощью импорта в скрипт команд tar-программы


import os
def remove(archive, unwanted):
    external = os.popen("c:\\gnuwin32\\bin\\tar.exe --version")
    x = external.read()
    external.close()
    if x[:13] == "tar (GNU tar)":
        command = "c:\\gnuwin32\\bin\\tar.exe --delete --verbose --file=%s %s" % (archive, unwanted)
        output = os.popen(command)
        y=output.read()
        output.close()
    else:
        print "Ошибка: Не могу удалить файл из tar-архива без GNU tar-программы."
        output = ""
    return output
remove("backup.tar", "archive.tar.gz")


Все скрипты были опробованы в Python 2.5.2 под ОС Win2003 и WinXP. Для работы с последним скриптом была установлена tar-программа в каталог c:\gnuwin32. Также последний скрипт работает только с файлами tar, но никак ни с tar.gz или tar.bz2.

Источник: scribd

2 комментария:

essay service writing комментирует...

Python?? прикольно по-ходу, раньше не слыхал за эту софтину. надо будет качнуть-ссс на досуге

professional writing company комментирует...

ты чего, друг - давно пора, вообще вешь! не сильно сложная, зато функций и возможностей море!