使用shutil.copytree复制拒绝权限的文件时处理异常

时间:2012-05-08 06:14:44

标签: python python-3.x

考虑以下目录树

Work--->subdir1--->File1
    |         |
    |         ---->File2
    |
    -->subdir2--->File3

存在另一个类似的目录树

Gold--->subdir1--->File1
    |         |
    |         ---->File2
    |
    -->subdir2--->File3

我必须编写一个脚本来将Work目录复制到另一个位置。我一直在使用shutil.copytree

问题是,有时(但并非总是)我可能无权访问File2目录中的某些文件,例如Work,并会收到以下错误:

Traceback (most recent call last):
File "C:\Script.py", line 81, in <module>
shutil.copytree(source_loc,dest_loc)
File "C:\Python32\lib\shutil.py", line 239, in copytree
   raise Error(errors)
   shutil.Error: [('C:\\Work\\subdir1\\File2', 
   'C:\\Dest\\subdir1\\File2', 
"[Errno 13] Permission denied: 'C:\\Work\\subdir1\\File2'")]

在这种情况下,我将不得不从Gold目录中复制相应的文件。 有没有办法可以通过异常自动从Gold目录复制相应的文件?说出类似的话:

try:
   shutil.copytree(r'C:\Work',r'C:\Dest')
except:
   << Copy Inaccessible Files from Gold >>

我最初考虑使用os.walk来单独复制文件。这样,每当我遇到特定文件的异常时,我都可以从Gold复制相应的文件。还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

您可以从shutil.Error获取无法复制的文件列表。从读取源代码,shutil.Error包含(src,dst,why)三元组。你可以这样做:

try:
    shutil.copytree(srcdir, dstdir)
except shutil.Error, exc:
    errors = exc.args[0]
    for error in errors:
        src, dst, msg = error
        # Get the path to the file in Gold dir here from src
        shutil.copy2(goldsrc, dst)

答案 1 :(得分:1)

是的,使用os.walk将是正确的方法。

copytree有限。它不是一个复杂的复制工具,它在文档字符串中也是如此:

XXX Consider this example code rather than the ultimate tool.

(本说明已在Python 3中删除)