ディレクトリとそのすべての内容を既存のパスにコピーしようとしています。問題は、osモジュールとshutilモジュールの間で、これを行う方法がないように思われることです。 shutil.copytree()
関数は、宛先パスが事前に存在しないことを想定しています。
私が探している正確な結果は、フォルダ構造全体を別の構造の上にコピーし、見つかった重複をサイレントに上書きすることです。飛び込んでこれを行うための独自の関数を書き始める前に、これを行う既存のレシピまたはスニペットを誰かが知っているかどうか尋ねたいと思いました。
distutils.dir_util.copy_tree
あなたが望むことをします。
ディレクトリツリーsrc全体を新しい場所dstにコピーします。 srcとdstはどちらもディレクトリ名である必要があります。 srcがディレクトリでない場合は、DistutilsFileErrorを発生させます。 dstが存在しない場合は、mkpath()で作成されます。コピーの最終結果は、src内のすべてのファイルがdstにコピーされ、srcの下のディレクトリが再帰的にdstにコピーされることです。出力名を使用して、コピーされた、またはコピーされた可能性のあるファイルのリストを返します。戻り値はupdateまたはdry_runの影響を受けません。これは、srcの下のすべてのファイルのリストであり、名前がdstの下に変更されています。
(上記のURLでより多くのドキュメント)
「ディレクトリがすでに存在する場合、ディレクトリを作成できません」というエラーが表示されますか?これがどれほどばかげているかはわかりませんが、コピーツリーモジュールに1行挿入するだけでした。変更しました:
def copytree(src, dst, symlinks=False):
names = os.listdir(src)
os.makedirs(dst)
に:
def copytree(src, dst, symlinks=False):
names = os.listdir(src)
if (os.path.isdir(dst)==False):
os.makedirs(dst)
私はいくつかの青ざめたと思います。もしそうなら、誰かが私にそれを指摘できますか?申し訳ありませんが、私はpython:P
このような高レベルのファイル操作には、 shutil モジュールを使用し、場合はcopytree関数を使用します。私はそれがdistutilsを「乱用する」よりもきれいだと思います。
UPDATE::答えを忘れて、OPがshutilを試みたことを見逃しました。
os.walk
を使用して自分で実装してみませんか?