如何使用Python将整个文件目录复制到现有目录中?

2024-03-29 15:02:10 发布

您现在位置:Python中文网/ 问答频道 /正文

从包含名为bar(包含一个或多个文件)的目录和名为baz(也包含一个或多个文件)的目录中运行以下代码。确保没有名为foo的目录。

import shutil
shutil.copytree('bar', 'foo')
shutil.copytree('baz', 'foo')

它将失败:

$ python copytree_test.py 
Traceback (most recent call last):
  File "copytree_test.py", line 5, in <module>
    shutil.copytree('baz', 'foo')
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/shutil.py", line 110, in copytree
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/os.py", line 172, in makedirs
OSError: [Errno 17] File exists: 'foo'

我想让它的工作方式和我打字一样:

$ mkdir foo
$ cp bar/* foo/
$ cp baz/* foo/

是否需要使用shutil.copy()baz中的每个文件复制到foo?(在我已经用shutil.copytree()将“bar”的内容复制到“foo”之后?)还是有更简单/更好的方法?


Tags: 文件inpytest目录foolinelibrary
3条回答

在atzz对上述函数总是试图将文件从源复制到目的地的函数的回答上有了一些小小的改进。

def copytree(src, dst, symlinks=False, ignore=None):
    if not os.path.exists(dst):
        os.makedirs(dst)
    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        if os.path.isdir(s):
            copytree(s, d, symlinks, ignore)
        else:
            if not os.path.exists(d) or os.stat(s).st_mtime - os.stat(d).st_mtime > 1:
                shutil.copy2(s, d)

在我上面的实现中

  • 创建输出目录(如果不存在)
  • 通过递归调用我自己的方法来复制目录。
  • 当我们真正复制文件时,我会检查文件是否被修改,然后 我们应该复制。

我正在使用上面的函数和scons构建。这对我帮助很大,因为每次编译时,我可能不需要复制整个文件集。。但只有修改过的文件。

这是标准库的一部分解决方案。

from distutils.dir_util import copy_tree
copy_tree("/a/b/c", "/x/y/z")

看这个类似的问题。

Copy directory contents into a directory with python

标准shutil.copytree的这种限制似乎是任意的,令人讨厌。解决方法:

def copytree(src, dst, symlinks=False, ignore=None):
    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        if os.path.isdir(s):
            shutil.copytree(s, d, symlinks, ignore)
        else:
            shutil.copy2(s, d)

请注意,它与标准的copytree并不完全一致:

  • 它不支持树的根目录的symlinksignore参数
  • 它不会提高shutil.Error的根级别的错误
  • 如果复制子树时出错,它将为该子树提升shutil.Error,而不是尝试复制其他子树并提升单个组合的shutil.Error

相关问题 更多 >