考虑以下目录树
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复制相应的文件。还有更好的方法吗?
答案 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中删除)