【问题标题】:How to copy a directory and its contents to an existing location using Python?如何使用 Python 将目录及其内容复制到现有位置?
【发布时间】:2010-10-05 11:01:30
【问题描述】:

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

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

【问题讨论】:

    标签: python operating-system filesystems copy


    【解决方案1】:

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

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

    (以上网址有更多文档)

    【讨论】:

    • 这个没见过,很好找。我唯一需要注意的是,它没有给出哪些文件被覆盖以及哪些文件被重新创建的指示。但是,只要这不是必需的,这看起来很完美。
    • 这是一个不错的选择,尽管它需要安装 distutils。不是什么大问题,因为无论如何我们都将它捆绑到一个带有 pyinstaller 的 EXE 中。
    • distutils 是标准库的一部分,因此理论上应该始终安装。
    • 我尝试使用 distutils 并得到错误:mkpath: 'name' must be a string (got ['/tmp/2']) 这可以与列表一起使用吗?
    【解决方案2】:

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

    【讨论】:

    • 这就是我正在考虑的,但我想确保我没有重新发明轮子。
    【解决方案3】:

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

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

    【讨论】:

    • 我在我的问题中提到了 shutil.copytree() 是我试图使用但不符合要求的。
    • 我通常会同意这一点,但它并不完全符合 O.P. 的要求。
    • 你们是对的,我在问题中忽略了这一点,那天晚上太晚了:-)
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2019-04-04
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2021-08-07
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多