Копирование файлов с указанными расширениями с сохранением древовидной структуры папок - PullRequest
1 голос
/ 17 апреля 2020

Я написал (с огромной помощью inte rnet) скрипт, который предназначен для копирования файлов с указанными расширениями из папки destiantion (и всех подпапок) в новую папку.

Я сделал это частично, но у меня есть проблема.

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

Моя функция делает это:

def copy_files_spec_ext(ext, file_path, root_path, dest_path):
ext_counter=0
ext="."+ext;
for root_path, dnames, fnames in os.walk(root_path):    
    for crt_file in fnames:
        if crt_file.endswith(ext):
            source_file_path =  os.path.join(root_path, crt_file)
            dest_file_path   =  os.path.join(dest_path, crt_file)
            shutil.copyfile(source_file_path, dest_file_path)
            ext_counter=ext_counter+1;
return ext_counter;

Код является модификацией того, что я нашел здесь

Я довольно новый в python (пара месяцев не интенсивное кодирование), поэтому, пожалуйста, помилуйте ;-). Заранее спасибо за помощь.

PS. Извините за бедного Энгли sh.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Хорошо, я снова прочитал этот код и, по-видимому, обнаружил, что я делаю неправильно. Я делаю еще одну переменную, в которой хранится разница между исходным путем, который был задан функции, и путем, в котором был найден файл, и добавляю эту разницу к пути назначения.

Теперь код выглядит следующим образом :

def copy_files_spec_ext(ext, file_path, root_path, dest_path):
ext_counter=0
ext="."+ext;
static_root_path=root_path;
for root_path, dnames, fnames in os.walk(root_path):    
    for crt_file in fnames:
        if crt_file.endswith(ext):
            source_file_path =  os.path.join(root_path, crt_file)
            additional_folders=os.path.relpath(root_path, static_root_path);
            dest_file_path   =  os.path.join(dest_path, additional_folders, crt_file)
            shutil.copyfile(source_file_path, dest_file_path)
            ext_counter=ext_counter+1;
return ext_counter;
0 голосов
/ 17 апреля 2020

Вы забыли добавить путь к каталогу источника в месте назначения:

source_file_path = os.path.join(root_path, crt_file)
dest_file_path   = os.path.join(dest_path, root_path ,crt_file)
...