Первые шаги
Первое что пришло в голову - использовать для задачи os.walk(). Данная функция делает рекурсивный проход по указаному пути, принимая параметром папку в качестве корня дерева, которое необходимо обойти. Стоит заметить, что здесь важным параметром является topdown, в том случае если вы на каждом шаге хотите предпринимать некие действия (в моем случае - это прогресс бар, который выступает индикатором прохождения процесса корпирвоания) . Это необязательный параметр, который принимает булевое значение, определяющее порядок обхода. Для копирования решил использовать функцию copy модуля shutil, который входит в стандартную библиотеку python. Вуаля, все работает. Удаляем файлы после запуска программы, аналогично обходя дерево только уже в той папке, в которую были скопированы файлы.
Небольшая проблемка
Зачем огород городился? Особенностью данной задачи является то, что файлы необходимо копировать из оптического носителя (CD/DVD-диска). Копировать на жесткий диск необходимо, поскольку некоторые приложения для своей работы используют временые файлы, а также пишут данные в файлы настроект. В чем отличие? А отличие в том, что при ипользовании функции copy файлы копируются вместе с битами доступа, а так как источником является оптический диск, то они обозначаются как "только для чтения".
Решение
Решение довольно простое - использовать функцию copyfile из этого же модуля, который не сохраняет биты доступа. Таким образом файлы с легкостью могут быть удалены.
Знание - сила
Модуль shutils обладает также достаточно удобными и полезными функциями массовой обработки файлов, как, например, copytree, или rmtree, которые позволяют отказаться от использования os.walk(). В данном случае copytree использовать не получится, так как нельзя вставить дополнительный код на этапе копирования отдельного файла, а rmtree очень даже хорошо сокращает количество кода.
Выводы
Знание - сила. Перед решением задачи делаем более глубокое исследование готовых решений и инструментов и не полагаемся на уже приобретенные знания.
Комментариев нет:
Отправить комментарий