10

「copytree(src、dst)」を使用しようとしましたが、宛先フォルダーが存在するはずなので使用できませんでした。ここに、私が作成した小さなコードを示します。

def copy_dir(src,dest):
    import shutil
    shutil.copytree(src,dest)

copy_dir('C:/crap/chrome/','C:/test/') 

そしてこれは私が期待したように私が得ているエラーです...

Traceback (most recent call last):
File "C:\Documents and Settings\Administrator\workspace\MMS-Auto\copy.py", line 5, in        <module>
copy_dir('C:/crap/chrome/','C:/test/')   
File "C:\Documents and Settings\Administrator\workspace\MMS-Auto\copy.py", line 3, in copy_dir
shutil.copytree(src,dest)
File "C:\Python27\lib\shutil.py", line 174, in copytree
os.makedirs(dst)
File "C:\Python27\lib\os.py", line 157, in makedirs
mkdir(name, mode)
WindowsError: [Error 183] Cannot create a file when that file already exists:    'C:/test/'

これが私の質問です。独自のコピーツリー関数を作成せずに同じ結果を達成できる方法はありますか?

前もって感謝します。

4

4 に答える 4

14

私はこのdistutilsパッケージを使用して、ここにある他の回答よりも大きな成功を収めました。

http://docs.python.org/2/distutils/apiref.html#module-distutils.dir_util

この関数は、例外でクラッシュするのではなく、存在するディレクトリを上書きすることを除いて、distutils.dir_util.copy_tree非常によく似ています。shutil.copytreedir_util.copy_tree

交換:

import shutil
shutil.copytree(src, dst)

と:

import distutils.dir_util
distutils.dir_util.copy_tree(src, dst)
于 2013-06-28T05:53:42.260 に答える
1

errno考えられるエラーを探します。最初に使用でき.copytree()、エラーが発生した場合はを使用しますshutil.copy

差出人: http: //docs.python.org/library/shutil.html#shutil.copytree

例外が発生した場合、理由のリストとともにエラーが発生します。

したがって、それをどうするかを決定し、それを処理するためのコードを実装できます。

import shutil, errno

def copyFile(src, dst):
    try:
        shutil.copytree(src, dst)
    # Depend what you need here to catch the problem
    except OSError as exc: 
        # File already exist
        if exc.errno == errno.EEXIST:
            shutil.copy(src, dst)
        # The dirtory does not exist
        if exc.errno == errno.ENOENT:
            shutil.copy(src, dst)
        else:
            raise

概要.copy()http ://docs.python.org/library/shutil.html#shutil.copy

ファイルsrcをファイルまたはディレクトリdstにコピーします。dstがディレクトリの場合、指定されたディレクトリにsrcと同じベース名のファイルが作成(または上書き)されます。許可ビットがコピーされます。srcとdstは、文字列として指定されたパス名です。

編集:多分また調べてくださいdistutils.dir_util.copy_tree

于 2012-04-06T18:49:31.270 に答える
1

shutil.copytree関数を実行する前に、最初にその場所に同じ名前のディレクトリがあるかどうかを確認するための少しの回避策があります。また、特定のワイルドカードを使用してディレクトリのみをコピーします。質問に答えるのにそれが必要かどうかはわかりませんが、そのままにしておくことにしました。

import sys
import os
import os.path
import shutil 


src="/Volumes/VoigtKampff/Temp/_Jonatha/itmsp_source/"
dst="/Volumes/VoigtKampff/Temp/_Jonatha/itmsp_drop/"


for root, dirs, files in os.walk(src):
    for dir in dirs:
        if dir.endswith('folder'):
            print "directory to be moved: %s" % dir
            s = os.path.join(src, dir)
            d = os.path.join(dst, dir)
            if os.path.isdir(d):
                print "Not copying - because %s is already in %s" % (dir, dst)
            elif not os.path.isdir(d):
                shutil.copytree(s, d)
                print "Copying %s to %s" % (dir, dst)
于 2013-03-06T17:27:36.577 に答える
0

これはあなたが持っているPythonの正確なバージョンに依存すると確信していますが、shutil.copytreeを呼び出すと。doc私はこれを取得します:

copy2()を使用して、ディレクトリツリーを再帰的にコピーします。

宛先ディレクトリはまだ存在していてはなりません。

XXX究極のツールではなく、このサンプルコードを検討してください。

これはあなたが得ているエラーを説明しています。代わりに、おそらくdistutils.dir_util.copy_treeを使用できます。

于 2012-04-06T18:45:17.467 に答える