如何将c:\\ xxx \ yyy中所有文件的目录复制到python中的c:\\ zzz \

时间:2012-04-06 18:20:50

标签: python python-2.7

我一直在尝试使用“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函数,我可以实现相同的结果吗?

提前谢谢。

4 个答案:

答案 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