2012-04-06 3 views
4

Ich habe versucht, "copytree (src, dst)" zu verwenden, aber ich konnte seit dem nicht Zielordner sollte all.Here vorhanden ist, kann man das kleine Stück Code sehe ich schrieb:Wie kopiert man Verzeichnis mit allen Dateien von c: \ xxx yyy nach c: \ zzz in python

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

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

und das ist der Fehler, den ich immer bin wie ich erwartet hatte ...

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/' 

Hier ist mein Frage: Gibt es eine Möglichkeit, das gleiche Ergebnis zu erzielen, ohne eine eigene Copytree-Funktion zu erstellen?

Vielen Dank im Voraus.

+0

Was möchten Sie tun? Überschreiben Sie die Dateien? Soll das Original vorhanden sein, wenn bereits eine Datei existiert? – marue

+0

wäre genug, um sie nur zu kopieren, aber ich möchte hinzufügen, fügen Sie eine solche Funktionalität später – nassio

Antwort

1

Betrachten Sie errno für mögliche Fehler. Sie können zuerst .copytree() verwenden und dann, wenn ein Fehler vorliegt, shutil.copy verwenden.

Von: http://docs.python.org/library/shutil.html#shutil.copytree

If exception(s) occur, an Error is raised with a list of reasons.

Sie können also dann entscheiden, was damit zu tun und Ihren Code implementieren es zu handhaben.

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 

über .copy(): http://docs.python.org/library/shutil.html#shutil.copy

Copy the file src to the file or directory dst. If dst is a directory, a file with the same basename as src is created (or overwritten) in the directory specified. Permission bits are copied. src and dst are path names given as strings.

Edit: Vielleicht auch in aussehen distutils.dir_util.copy_tree

+0

in der If-Anweisung haben Sie nichts aufgerufen ... was soll ich da hinzufügen? – nassio

+0

ok danke, trotzdem bekomme ich "WindowsError: [Fehler 183] Kann keine Datei erstellen, wenn diese Datei bereits existiert: 'C:/test /'" – nassio

+0

Edit: Wenn die Datei 'EEXIST' existiert, dann benutze' .copy() ', sollte es sie überschreiben. – George

0

Ich bin ziemlich sicher, das hängt von der genauen Version von Python, die Sie haben, aber wenn ich shutil.copytree aufrufen. doc ich dieses:

Recursively copy a directory tree using copy2().

The destination directory must not already exist.

XXX Consider this example code rather than the ultimate tool.

Dies erklärt den Fehler, den Sie bekommen. Sie könnten stattdessen distutils.dir_util.copy_tree verwenden.

+0

Ich möchte nichts zu Python selbst hinzufügen, obwohl, wenn ich nicht in der Lage, es sonst zu tun, ich ' ll go it – nassio

+0

Sie meinen, Sie wollen keine Bibliothek importieren? Du hast Shutsil importiert, du kannst genauso gut 'Import Distutils' schreiben. – marue

+0

Entschuldigung, ich habe die Python-Dokumentation falsch gelesen, danke, es funktioniert ... Danke wieder – nassio

1

Ich habe eine wenig Arbeit um das überprüfen, ob ein Verzeichnis mit dem gleichen Namen ist in der Standort zuerst, bevor Sie die Funktion shutil.copytree ausführen. Außerdem kopiert es nur Verzeichnisse mit einem bestimmten Platzhalter. Ich bin mir nicht sicher, ob das nötig ist, um die Frage zu beantworten, aber ich dachte, ich würde es da drinnen lassen.

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) 
7

Ich benutzte das distutils Paket zu mehr Erfolg als die anderen Antworten hier.

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

Die distutils.dir_util.copy_tree Funktion funktioniert sehr ähnlich wie shutil.copytree außer dass dir_util.copy_tree wird nur ein Verzeichnis überschreiben, die statt Absturz mit einer Ausnahme besteht.

ersetzen:

import shutil 
shutil.copytree(src, dst) 

mit:

import distutils.dir_util 
distutils.dir_util.copy_tree(src, dst)