четверг, 7 октября 2010 г.

Особенности промышленного копирования файлов в Python

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

Первые шаги

Первое что пришло в голову - использовать для задачи os.walk(). Данная функция делает рекурсивный проход по указаному пути, принимая параметром папку в качестве корня дерева, которое необходимо обойти. Стоит заметить, что здесь важным параметром является topdown, в том случае если вы на каждом шаге хотите предпринимать некие действия (в моем случае - это прогресс бар, который выступает индикатором прохождения процесса корпирвоания) . Это необязательный параметр, который принимает булевое значение, определяющее порядок обхода. Для копирования решил использовать функцию copy модуля shutil, который входит в стандартную библиотеку python. Вуаля, все работает. Удаляем файлы после запуска программы, аналогично обходя дерево только уже в той папке, в которую были скопированы файлы.

Небольшая проблемка

Зачем огород городился? Особенностью данной задачи является то, что файлы необходимо копировать из оптического носителя (CD/DVD-диска). Копировать на жесткий диск необходимо, поскольку некоторые приложения для своей работы используют временые файлы, а также пишут данные в файлы настроект. В чем отличие? А отличие в том, что при ипользовании функции copy файлы копируются вместе с битами доступа, а так как источником является оптический диск, то они обозначаются как "только для чтения".

Решение

Решение довольно простое - использовать функцию copyfile из этого же модуля, который не сохраняет биты доступа. Таким образом файлы с легкостью могут быть удалены.

Знание - сила

Модуль shutils обладает также достаточно удобными и полезными функциями массовой обработки файлов, как, например, copytree, или rmtree, которые позволяют отказаться от использования os.walk(). В данном случае copytree использовать не получится, так как нельзя вставить дополнительный код на этапе копирования отдельного файла, а rmtree очень даже хорошо сокращает количество кода.

Выводы

Знание - сила. Перед решением задачи делаем более глубокое исследование готовых решений и инструментов и не полагаемся на уже приобретенные знания.

Комментариев нет:

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

В этом гаджете обнаружена ошибка