2

考虑以下目录树

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 复制相应的文件。有没有更好的办法?

4

2 回答 2

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)
于 2012-05-08T06:31:14.407 回答
1

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

copytree是有限的。它并非设计为复杂的复制工具,并且在其文档字符串中也是如此:

XXX Consider this example code rather than the ultimate tool.

(此注释已在 Python 3 中删除)

于 2012-05-08T06:20:44.880 回答