使用python将目录内容复制到目录中[重复]

Posted

技术标签:

【中文标题】使用python将目录内容复制到目录中[重复]【英文标题】:Copy directory contents into a directory with python [duplicate] 【发布时间】:2013-02-22 22:19:17 【问题描述】:

我有一个包含文件和子目录的目录 /a/b/c。 我需要将 /a/b/c/* 复制到 /x/y/z 目录中。我可以使用哪些 python 方法?

我尝试了shutil.copytree("a/b/c", "/x/y/z"),但python 尝试创建/x/y/z 并引发error "Directory exists"

【问题讨论】:

您是否要移动或复制目录?您的标题说移动,但您的内容说复制。由于这是两件不同的事情,所以你指的是哪一件很重要。 也许可以举一个前后的例子,让你更清楚你想要的效果是什么? Np。此外,就像@Xymotech 所说,我们对所需的输出有点不清楚。你想要:/x/y/z/a/b/c 还是 /x/y/z/c?您对copytree 的使用暗示了前者,但我只是想确定一下。 您可以先删除任何/x/y/z/ 目录(shutil.rmtree())然后再删除copytree() 通过copytreedirs_exist_ok=True 标志,这不再是Python 3.8 的问题。见doc 【参考方案1】:

我发现这段代码是标准库的一部分:

from distutils.dir_util import copy_tree

# copy subdirectory example
from_directory = "/a/b/c"
to_directory = "/x/y/z"

copy_tree(from_directory, to_directory)

参考:

Python 2:https://docs.python.org/2/distutils/apiref.html#distutils.dir_util.copy_tree Python 3:https://docs.python.org/3/distutils/apiref.html#distutils.dir_util.copy_tree

【讨论】:

一个很好的解决方案,如果你需要的话,我建议将 update=1 添加到 copy_tree() 中。 请记住,如果您为同一组 args 调用两次 copy_tree 将失败,同时您已经擦除了目标。这是由于 mkpath 中的路径缓存,请参阅 bugs.python.org/issue10948 有趣的是,循环中的shutil.copy2比复制整个目录要快得多。 如果您反复将文件夹复制到同一目的地,请勿使用此功能。正如@yacoob 所说,这将以意想不到的方式失败。弄清楚这件事让我很头疼。我再次发表评论以提高其他人的知名度。 仅供参考 pathlib 路径对象破坏 dir_utils,它将路径作为文本。【参考方案2】:

也可以使用glob2递归收集所有路径(使用**子文件夹通配符),然后使用shutil.copyfile,保存路径

glob2 链接:https://code.activestate.com/pypm/glob2/

【讨论】:

【参考方案3】:
from subprocess import call

def cp_dir(source, target):
    call(['cp', '-a', source, target]) # Linux

cp_dir('/a/b/c/', '/x/y/z/')

它对我有用。基本上,它执行shell命令cp

【讨论】:

是的,但这不是pythonic方式:) @ArtsiomPraneuski 我同意,但有时可能会有所帮助。 :) 不能在 POSIX 之外工作 谢谢!这比其他方法快得多! @Alldb 是不是更快?您是否对其进行了基准测试?【参考方案4】:

python 库已过时使用此功能。我已经完成了一个可以正常工作的:

import os
import shutil

def copydirectorykut(src, dst):
    os.chdir(dst)
    list=os.listdir(src)
    nom= src+'.txt'
    fitx= open(nom, 'w')

    for item in list:
        fitx.write("%s\n" % item)

    fitx.close()

    f = open(nom,'r')
    for line in f.readlines():
        if "." in line:
            shutil.copy(src+'/'+line[:-1],dst+'/'+line[:-1])
        else:
            if not os.path.exists(dst+'/'+line[:-1]):
                os.makedirs(dst+'/'+line[:-1])
                copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
            copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
    f.close()
    os.remove(nom)
    os.chdir('..')

【讨论】:

这叫做“Kludge”

以上是关于使用python将目录内容复制到目录中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python [复制目录的所有内容]将目录的所有内容复制到另一个目录#FileOperation

如何使用 python 覆盖复制完整目录及其内容?

使用 Python 将文件从多个目录复制到一个目录

如何使用 C++ 复制目录 [重复]

将目录的内容复制到 NSArray

将目录文件复制到子文件夹中