33

我正在尝试将目录及其所有内容复制到已经存在的路径中。问题是,在 os 模块和 shutil 模块之间,似乎没有办法做到这一点。该shutil.copytree()函数期望目标路径事先不存在。

我正在寻找的确切结果是将整个文件夹结构复制到另一个之上,在找到的任何重复项上静默覆盖。在我开始编写自己的函数来执行此操作之前,我想我会问是否有人知道这样做的现有食谱或片段。

4

4 回答 4

43

distutils.dir_util.copy_tree做你想做的事。

将整个目录树 src 复制到新位置 dst。src 和 dst 都必须是目录名。如果 src 不是目录,则引发 DistutilsFileError。如果 dst 不存在,则使用 mkpath() 创建它。复制的最终结果是src中的每个文件都复制到dst,src下的目录递归复制到dst。使用它们的输出名称返回已复制或可能已复制的文件列表。返回值不受 update 或 dry_run 影响:它只是 src 下所有文件的列表,名称更改为 dst 下。

(以上网址中的更多文档)

于 2009-02-04T17:03:21.463 回答
0

为什么不使用自己实现它os.walk

于 2009-02-04T16:56:19.763 回答
0

对于像这样的高级文件操作,请使用shutil模块,在您的情况下使用 copytree 函数。我认为这比“滥用” distutils 更干净。

更新::忘记答案,我忽略了OP确实尝试了shutil。

于 2009-02-04T22:06:33.070 回答
0

您是否收到“无法在目录已存在时创建目录”的错误消息?我不确定这有多傻,但我所做的只是在 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

于 2009-03-05T16:08:51.540 回答