2

次のディレクトリ ツリーを検討してください。

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

同様のディレクトリ ツリーがもう 1 つあります。

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 に答える