0

Guyz-私はshutil.copyツリーがディレクトリが存在しないのにディレクトリが存在すると考えるというこの問題を抱えています..ソースとディレクトリの両方がローカルです...最初に実行したときはエラーなしで実行されましたが、コンテンツは実際にはコピーされません、2回目ディレクトリがすでに存在すると考えて実行しました。詳細は以下のとおりです。shutil以外にコピーする方法がある場合は、入力内容を入力してください。提案してください。

エラーなしで最初の時間が実行されましたが、実際にはコピーされませんでした

  <username:/local/mnt/workspace/username/Scripts>python test.py
    //local/mnt/workspace/loc/04.01.01.00.303_HY11/out
    //local/mnt/workspace/test/out
    copying

2回目の再実行、ディレクトリが存在すると思われる

    <username:/local/mnt/workspace/username/Scripts>python test.py
    //local/mnt/workspace/loc/04.01.01.00.303_HY11/out
    //local/mnt/workspace/test/out
    copying
    Traceback (most recent call last):
      File "test.py", line 21, in <module>
        main()
      File "test.py", line 18, in main
        copytree(src,dst)
      File "test.py", line 11, in copytree
        shutil.copytree(s, d)
      File "/pkg/qct/software/python/2.5.2/.amd64_linux26/lib/python2.5/shutil.py", line 110, in copytree
        os.makedirs(dst)
      File "/pkg/qct/software/python/2.5.2/.amd64_linux26/lib/python2.5/os.py", line 171, in makedirs
        mkdir(name, mode)
    OSError: [Errno 17] File exists: '//local/mnt/workspace/test/out'
    <username:/local/mnt/workspace/username/Scripts>

Pythonコード

import os,shutil

def copytree(src, dst, symlinks=False, ignore=None):
    for item in os.listdir(src):
        s = os.path.join(src, item)
        print s
        d = os.path.join(dst, item)
        print d
        if os.path.isdir(s):
            print "copying"
            shutil.copytree(s, d, symlinks, ignore)
        else:
            shutil.copy2(s, d)
def main ():
    src="//local/mnt/workspace/loc/04.01.01.00.303_HY11"
    dst="//local/mnt/workspace/test"
    copytree(src,dst)

if __name__ == '__main__':
    main()
4

2 に答える 2

1

このバージョンを試してみてください。宛先ディレクトリは自動的にクリアされます...

import os,shutil,errno

def copytree(src, dst, symlinks=False, ignore=None):
    if os.path.exists(dst):
        shutil.rmtree(dst)

    os.mkdir(dst)

    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        print s + " >> " + d

        if ".git" in s:
            return

        if os.path.isdir(s):
            print "Copying directory..."

            try:
                copytree(s, d, symlinks, ignore)

            except OSError as e: 
                # File already exist
                if e.errno == errno.EEXIST:
                    print "Path exists : " + d
        else:
            shutil.copy2(s, d)

def main ():
    src="//local/mnt/workspace/loc/04.01.01.00.303_HY11"
    dst="//local/mnt/workspace/test"
    copytree(src,dst)

if __name__ == '__main__':
    main()
于 2013-01-06T06:13:22.853 に答える
0

shutil.copytree()代わりに使ってみませんか?shutil.copytree()(たとえば、既存のディレクトリを検討するために)ラッパーを使用したい場合は、関数に別の名前を付けますcopytree_wrapper()(とを混合copytreeしていてshutil.copytree、再帰には関係がないcopytreeため)。次のように機能します。

import os,shutil

def copytree_wrapper(src, dst, symlinks=False, ignore=None): ### Name it different, no confusion!
    for item in os.listdir(src):
        s = os.path.join(src, item)
        print (s)
        d = os.path.join(dst, item)
        print (d)
        if os.path.isdir(s):
            print ("copying")
            if not os.path.exists(d): ### Create directory if does not already exist 
                print ("directory '%s' created" % d)
                os.makedirs(d)
            copytree_wrapper(s, d, symlinks, ignore) ### shutil.copytree(s, d, symlinks, ignore)
        else:
            shutil.copy2(s, d)
def main ():
    src="/tmp/a"
    dst="/tmp/b"
    copytree_wrapper(src,dst)

if __name__ == '__main__':
    main()
于 2013-01-06T06:14:31.400 に答える