Как скопировать каталог и его содержимое в существующее место с помощью Python?

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

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

4 Solutions collect form web for “Как скопировать каталог и его содержимое в существующее место с помощью Python?”

distutils.dir_util.copy_tree делает то, что вы хотите.

Скопируйте полное дерево каталогов src в новое место dst. Оба src и dst должны быть именами каталогов. Если src не является каталогом, поднимите DistutilsFileError. Если dst не существует, он создается с помощью mkpath (). Конечным результатом копии является то, что каждый файл в src копируется в dst, а каталоги под src рекурсивно копируются в dst. Верните список файлов, которые были скопированы или, возможно, были скопированы, используя их имя вывода. На возвращаемое значение не влияет обновление или dry_run: это просто список всех файлов под src, с именами, которые были изменены под dst.

(дополнительная документация по указанному выше URL-адресу)

Почему бы не реализовать его самостоятельно, используя os.walk ?

Для операций с файлами высокого уровня, например, с использованием модуля shutil, а в вашем случае – функции copytree. Я думаю, что это чище, чем «злоупотребление» distutils.

ОБНОВЛЕНИЕ:: Забудьте ответ, я не обратил внимания на то, что ОП действительно старался заткнуться.

Вы получаете сообщение об ошибке «Не удается создать каталог, когда он уже присутствует»? Я не уверен, насколько это глупо, но все, что я сделал, это вставить одну строку в модуль copytree: я изменил:

 def copytree(src, dst, symlinks=False): names = os.listdir(src) os.makedirs(dst) 

в:

 def copytree(src, dst, symlinks=False): names = os.listdir(src) if (os.path.isdir(dst)==False): os.makedirs(dst) 

Наверное, я сделал несколько бладеров. Если да, мог бы кто-нибудь указать мне на это? Извините, я очень новичок в python: P

Python - лучший язык программирования в мире.