Как скопировать определённые файлы с папками в которых они лежат?
Подскажите пожалуйста, как я могу скопировать определённые файлы, скажем, заканчивающиеся на "_0.dds" вместе с папками в которых этот файл лежит?
Поскольку путей к файлам и директорий много то метод os.listdir() мне не очень помогает, а метод shutil.copytree() копирует все файлы без исключения.
Пример кода, который я пробовал:
import os
import shutil
for adress, dirs, files in os.walk('C:\\Users\\user\\Desktop\\1\\a_ui\\data\\ui'):
for file in files:
filename = os.path.join(adress, file)
if "_0.dds" in filename:
shutil.copy2(filename, 'C:\\Users\\user\\Desktop\\1\\a_ui\\aassets')
# shutil.copytree(adress, "C:\\Users\\user\\Desktop\\1\\a_ui\\aASSETS")
if "_2.dds" in filename:
pass
print("DONE!")
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Подробно описал в комментариях алгоритм
Попробуйте:
import shutil
from pathlib import Path
# Задаем папки: откуда ищем и куда копируем
source_dir = Path(r'C:\Users\user\Desktop\1\a_ui\data\ui')
target_dir = Path(r'C:\Users\user\Desktop\1\a_ui\aassets')
# Поиск выполняется рекурсивно по шаблону
# На всякий оборачиваем в list, т.к. rglob возвращает генератор и возможна ситуация
# рекурсивного создания одинакового дерева папок,
# когда в source_dir и target_dir папки совпадают
for file_name in list(source_dir.rglob('*_0.dds')):
# Получаем относительный путь от найденного файла к source_dir и составляем новый путь
new_file_name = target_dir / file_name.relative_to(source_dir)
# Берем папку файла и создаем ее, включая вложенность, не ругаемся, если папка уже есть
new_file_name.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(file_name, new_file_name)