Python 我如何错误地使用copytree,如何修复它,使其不会';不要陷入一个巨大的循环中?

Python 我如何错误地使用copytree,如何修复它,使其不会';不要陷入一个巨大的循环中?,python,recursion,copytree,Python,Recursion,Copytree,我正在尝试做一个函数,复制所有的目录和文件,并把它们放在一个文件夹中。此目录没有备份文件夹,因此我第一次使用“复制树”创建备份文件夹时,以及每次重新运行此程序时,它都应该再次备份(包括以前的备份)。我有一个问题,copytree陷入了一个巨大的递归循环,不知道我做错了什么。这是我的密码。它第一次工作,但当我第二次运行它时,它就搞砸了。argv[1]是要备份的本地文件夹。这将作为: %python3文件名foldername from os import path, walk, remove, m

我正在尝试做一个函数,复制所有的目录和文件,并把它们放在一个文件夹中。此目录没有备份文件夹,因此我第一次使用“复制树”创建备份文件夹时,以及每次重新运行此程序时,它都应该再次备份(包括以前的备份)。我有一个问题,copytree陷入了一个巨大的递归循环,不知道我做错了什么。这是我的密码。它第一次工作,但当我第二次运行它时,它就搞砸了。argv[1]是要备份的本地文件夹。这将作为:

%python3文件名foldername

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')

如果Versions文件夹已经存在,它会计算子文件夹的数量,并创建一个新文件夹,其标签为+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'))

因此,我无法使用copytree将其保存在原始数据的子文件夹中实现这一点?我更新了答案,以便您可以在需要时将备份存储在子文件夹中。ignore方法正是我所需要的。我在python库中读到过这方面的内容,但在实现它时遇到了困难。谢谢你,伙计!