Как я неправильно использую copytree и как я могу это исправить, чтобы он не попал в огромный цикл?

Я пытаюсь сделать функцию, которая копирует все каталоги и файлы и помещает их в папку. В этом каталоге нет папки для резервных копий, поэтому при первом создании я использую дерево копий, и каждый раз, когда вы перезапускаете эту программу, она должна выполнять резервное копирование снова (включая архивную копию). У меня проблема с копирайтом, попавшим в огромный рекурсивный цикл, и я не знаю, что я делаю неправильно. Вот мой код Это работает в первый раз, но когда я запускаю это во второй раз, это портит. argv[1] - это локальная папка, которую вы хотите сделать резервную копию. Это будет работать как:

% python3 имя файла

from os import path, walk, remove, mkdir, listdir
from sys import argv
from shutil import copytree


    if path.exists(argv[1]+'/Versions'):
        copytree(argv[1], argv[1]+ '/Versions/' + str((len(listdir(argv[1]+'/Versions')))+1))

    else:

        copytree(argv[1], argv[1]+'/Versions/1')

Если папка "Версии" уже существует, она подсчитывает количество подпапок и создает новую папку с ее меткой +1 к числу имеющихся папок.

1 ответ

Решение

Мне кажется, вы создаете резервную копию в подпапке папки, для которой вы создаете резервную копию.

Поэтому при следующем запуске сценария вы создаете резервную копию резервной копии, а затем резервную копию резервной копии и т. Д.

Поместите резервную копию в папку, которая не является подпапкой исходных данных, и ваш сценарий должен работать.

source_path = os.path.join(argv[1], '/Versions')
destination_path = os.path.join(argv[1], '..', '/Backup') 

#Now handle copying between these two locations
...

Использование метода игнорирования

Кроме того, вы можете передать в вызываемую copytree игнорировать определенные каталоги.

from shutil import copytree, ignore_patterns

copytree(source_path, destination_path, ignore=ignore_patterns('Versions'))
Другие вопросы по тегам