我需要将所有文件和文件夹复制到当前文件夹中的子目录。最好的方法是什么?我尝试了以下代码段,但如果目标目录已经存在则失败,因为它失败了。
def copy(d=os.path.curdir):
dest = "t"
for i in os.listdir(d):
if os.path.isdir(i):
shutil.copytree(i, dest)
else:
shutil.copy(i, dest)
我觉得可以更好,更轻松地完成同样的任务。我该怎么做?
答案 0 :(得分:2)
我永远不会在python上做到这一点,但我想到了以下解决方案。它看起来并不简单,但它应该可以工作并且可以简化(没有检查,抱歉,现在无法访问计算机):
def copyDirectoryTree(directory, destination, preserveSymlinks=True):
for entry in os.listdir(directory):
entryPath = os.path.join(directory, entry)
if os.path.isdir(entryPath):
entrydest = os.path.join(destination, entry)
if os.path.exists(entrydest):
if not os.path.isdir(entrydest):
raise IOError("Failed to copy thee, the destination for the `" + entryPath + "' directory exists and is not a directory")
copyDirectoryTree(entrypath, entrydest, preserveSymlinks)
else:
shutil.copytree(entrypath, entrydest, preserveSymlinks)
else: #symlinks and files
if preserveSymlinks:
shutil.copy(entryPath, directory)
else:
shutil.copy(os.path.realpath(entryPath), directory)
答案 1 :(得分:1)
请参阅http://docs.python.org/library/shutil.html中的代码,然后稍微调整一下(例如,尝试:围绕os.makedirs(dst))。
答案 2 :(得分:1)
延长mamnun的答案,
如果你想直接调用os,我建议使用cp -r,因为你似乎想要一个目录的递归副本。
答案 3 :(得分:0)
你真的需要使用python吗?因为shutil函数无法复制所有文件元数据和组权限。为什么不尝试内置操作系统命令,如linux中的cp
和Windows中的xcopy
?
您甚至可以尝试从python
运行这些命令import os
os.system("cp file1 file2")
希望这有帮助。
答案 4 :(得分:0)
这是我的python的递归复制方法的版本,似乎工作:)
def copy_all(fr, to, overwrite=True):
fr = os.path.normpath(fr)
to = os.path.normpath(to)
if os.path.isdir(fr):
if (not os.path.exists(to + os.path.basename(fr)) and not
os.path.basename(fr) == os.path.basename(to)):
to += "/" + os.path.basename(fr)
mkdirs(to)
for file in os.listdir(fr):
copy_all(fr + "/" + file, to + "/")
else: #symlink or file
dest = to
if os.path.isdir(to):
dest += "/"
dest += os.path.basename(fr)
if overwrite and (os.path.exists(dest) or os.path.islink(dest)
rm(dest)
if os.path.isfile(fr):
shutil.copy2(fr, dest)
else: #has to be a symlink
os.symlink(os.readlink(fr), dest)
def mkdirs(path):
if not os.path.isdir(path):
os.makedirs(path)
def rm(path):
if os.path.isfile(path) or os.path.islink(path):
os.remove(path)
elif os.path.isdir(path):
for file in os.listdir(path):
fullpath = path+"/"+file
os.rmdir(fullpath)