Как скопировать каталог и его содержимое в существующее место, используя Python? - PullRequest
32 голосов
/ 04 февраля 2009

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

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

Ответы [ 4 ]

42 голосов
/ 04 февраля 2009

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

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

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

0 голосов
/ 05 марта 2009

Получаете ли вы сообщение об ошибке «Не удается создать каталог, если он уже существует»? Я не уверен, насколько это глупо, но я всего лишь вставил одну строку в модуль 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

0 голосов
/ 05 февраля 2009

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

ОБНОВЛЕНИЕ: : Забудьте ответ, я упустил из виду, что ОП попытался shutil.

0 голосов
/ 04 февраля 2009

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

...