使用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()
?
通过copytree
的dirs_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将目录内容复制到目录中[重复]的主要内容,如果未能解决你的问题,请参考以下文章