我一直在尝试使用“copytree(src,dst)”,但我不能,因为目标文件夹应该存在。在这里你可以看到我写的一小段代码:
def copy_dir(src,dest):
import shutil
shutil.copytree(src,dest)
copy_dir('C:/crap/chrome/','C:/test/')
这就是我所得到的错误......
Traceback (most recent call last):
File "C:\Documents and Settings\Administrator\workspace\MMS-Auto\copy.py", line 5, in <module>
copy_dir('C:/crap/chrome/','C:/test/')
File "C:\Documents and Settings\Administrator\workspace\MMS-Auto\copy.py", line 3, in copy_dir
shutil.copytree(src,dest)
File "C:\Python27\lib\shutil.py", line 174, in copytree
os.makedirs(dst)
File "C:\Python27\lib\os.py", line 157, in makedirs
mkdir(name, mode)
WindowsError: [Error 183] Cannot create a file when that file already exists: 'C:/test/'
我的问题是,如果没有创建自己的copytree函数,我可以实现相同的结果吗?
提前谢谢。
答案 0 :(得分:9)
我使用distutils
软件包比其他答案更成功。
http://docs.python.org/2/distutils/apiref.html#module-distutils.dir_util
distutils.dir_util.copy_tree
函数与shutil.copytree
的工作方式非常相似,只是dir_util.copy_tree
只会覆盖存在的目录,而不是使用Exception崩溃。
替换:
import shutil
shutil.copytree(src, dst)
使用:
import distutils.dir_util
distutils.dir_util.copy_tree(src, dst)
答案 1 :(得分:1)
查看errno
可能出现的错误。您可以先使用.copytree()
,然后在出现错误时使用shutil.copy
。
来自:http://docs.python.org/library/shutil.html#shutil.copytree
如果发生异常,则会引发错误并列出一系列原因。
那么你可以决定如何处理它并实现你的代码来处理它。
import shutil, errno
def copyFile(src, dst):
try:
shutil.copytree(src, dst)
# Depend what you need here to catch the problem
except OSError as exc:
# File already exist
if exc.errno == errno.EEXIST:
shutil.copy(src, dst)
# The dirtory does not exist
if exc.errno == errno.ENOENT:
shutil.copy(src, dst)
else:
raise
关于.copy()
:http://docs.python.org/library/shutil.html#shutil.copy
将文件src复制到文件或目录dst。如果dst是目录, 在src中创建(或覆盖)与src具有相同基本名称的文件 指定的目录。权限位被复制。 src和dst是 以字符串形式给出的路径名称。
修改:或许也可以查看distutils.dir_util.copy_tree
答案 2 :(得分:1)
我做了一些工作,检查在执行shutil.copytree函数之前,该位置是否有一个同名目录。它也只复制带有某个通配符的目录。不确定是否需要回答这个问题,但我想把它放在那里。
import sys
import os
import os.path
import shutil
src="/Volumes/VoigtKampff/Temp/_Jonatha/itmsp_source/"
dst="/Volumes/VoigtKampff/Temp/_Jonatha/itmsp_drop/"
for root, dirs, files in os.walk(src):
for dir in dirs:
if dir.endswith('folder'):
print "directory to be moved: %s" % dir
s = os.path.join(src, dir)
d = os.path.join(dst, dir)
if os.path.isdir(d):
print "Not copying - because %s is already in %s" % (dir, dst)
elif not os.path.isdir(d):
shutil.copytree(s, d)
print "Copying %s to %s" % (dir, dst)
答案 3 :(得分:0)
我很确定这取决于您拥有的python的确切版本,但是当我调用shutil.copytree时。 doc 我得到了这个:
使用copy2()递归复制目录树。
目标目录必须不存在。
XXX考虑这个示例代码而不是最终工具。
这解释了您获得的错误。您可以改为使用distutils.dir_util.copy_tree。