1. ホーム
  2. パイソン

[解決済み】Pythonを使用して、ファイルのディレクトリ全体を既存のディレクトリにコピーするにはどうすればよいですか?

2022-03-29 16:35:31

質問

という名前のディレクトリを含むディレクトリから次のコードを実行してください。 bar (1つまたは複数のファイルを含む)という名前のディレクトリと baz (同じく1つまたは複数のファイルを含む)。 という名前のディレクトリがないことを確認してください。 foo .

import shutil
shutil.copytree('bar', 'foo')
shutil.copytree('baz', 'foo')

で失敗します。

$ python copytree_test.py 
Traceback (most recent call last):
  File "copytree_test.py", line 5, in <module>
    shutil.copytree('baz', 'foo')
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/shutil.py", line 110, in copytree
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/os.py", line 172, in makedirs
OSError: [Errno 17] File exists: 'foo'

タイプしたときと同じように動作させたい。

$ mkdir foo
$ cp bar/* foo/
$ cp baz/* foo/

を使用する必要がありますか? shutil.copy() の各ファイルをコピーするために bazfoo ? (すでに 'bar' の中身を 'foo' にコピーした後に shutil.copytree() ?) それとも、もっと簡単で良い方法があるのでしょうか?

どのように解決するのですか?

この規格の制限事項 shutil.copytree は、恣意的で迷惑な感じがします。回避策

import os, shutil
def copytree(src, dst, symlinks=False, ignore=None):
    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        if os.path.isdir(s):
            shutil.copytree(s, d, symlinks, ignore)
        else:
            shutil.copy2(s, d)

標準の copytree :

  • を尊重しません。 symlinksignore のルートディレクトリのパラメータを指定します。 src ツリーを作成します。
  • を発生させない。 shutil.Error のルートレベルでのエラーに対して src ;
  • サブツリーのコピー中にエラーが発生した場合は shutil.Error を上げる代わりに、そのサブツリーに対して shutil.Error .