如何使用Python将目录及其内容复制到现有位置?

33

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

我要达到的确切结果是将整个文件夹结构复制到另一个文件夹中,如果发现任何重复文件,则进行静默覆盖。在我开始编写自己的函数之前,我想问问是否有人知道现有的配方或片段可以实现这一点。

4个回答

43

distutils.dir_util.copy_tree可以实现你想要的功能。

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

(更多文档请参见上述网址)


1
以前没见过这个,不错的发现。我唯一的顾虑是它没有指示哪些文件被覆盖,哪些是新创建的。只要这不是必需的,这看起来就很完美。 - Ben Blank
这是一个不错的选择,尽管它需要安装distutils。由于我们将使用pyinstaller打包成EXE文件,所以这并不是太大的问题。 - Soviut
distutils是标准库的一部分,因此理论上始终应该安装。 - Ali Afshar
我尝试使用distutils,但出现了错误: mkpath: 'name'必须是字符串(得到了['/tmp/2']) 这个能用列表吗? - kamal

0

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


5
我考虑过这个,但我想确认一下我没有重复造轮子。 - Soviut

0

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

更新::忘记我的回答吧,我忽略了OP确实尝试过shutil。


1
我在我的问题中提到shutil.copytree()是我试图使用的函数,但并不合适。 - Soviut
1
我通常会同意这个观点,但它并没有完全满足 O.P. 的要求。 - Ali Afshar
1
你们说得对,我在问题中忽略了那个部分,当时太晚了。 :-) - André

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接