2009-02-04 9 views
32

Ich versuche, ein Verzeichnis und seinen gesamten Inhalt in einen Pfad zu kopieren, der bereits existiert. Das Problem ist, dass es zwischen dem os-Modul und dem shutlil-Modul keine Möglichkeit gibt, dies zu tun. Die Funktion shutil.copytree() erwartet, dass der Zielpfad nicht vorher existiert.Wie kopiert man ein Verzeichnis und seinen Inhalt mit Python an einen bestehenden Ort?

Das genaue Ergebnis, das ich suche, besteht darin, eine gesamte Ordnerstruktur übereinander zu kopieren und stillschweigend alle gefundenen Duplikate zu überschreiben. Bevor ich einspringe und anfange, meine eigene Funktion dafür zu schreiben, dachte ich, ich würde fragen, ob jemand von einem existierenden Rezept oder Schnipsel weiß, das das tut.

Antwort

42

distutils.dir_util.copy_tree macht was Sie wollen.

Copy an entire directory tree src to a new location dst. Both src and dst must be directory names. If src is not a directory, raise DistutilsFileError. If dst does not exist, it is created with mkpath(). The end result of the copy is that every file in src is copied to dst, and directories under src are recursively copied to dst. Return the list of files that were copied or might have been copied, using their output name. The return value is unaffected by update or dry_run: it is simply the list of all files under src, with the names changed to be under dst.

(mehr Informationen auf der oben genannte URL)

+1

Habe diesen schon mal nicht gesehen, guter Fund. Meine einzige Einschränkung ist, dass es keinen Hinweis darauf gibt, welche Dateien überschrieben wurden und welche neu erstellt wurden. Solange dies jedoch keine Voraussetzung ist, sieht das perfekt aus. –

+0

Dies ist ein guter, obwohl es erfordert, dass distutils installiert ist. Nicht so ein großes Problem, da wir das sowieso in eine EXE mit pyinstaller bündeln. – Soviut

+0

distutils ist Teil der Standardbibliothek, sollte also theoretisch immer installiert sein. –

0

Warum implementieren Sie es nicht selbst mit os.walk?

+5

das war, was ich in Erwägung gezogen, aber ich wollte sicherstellen, dass ich nicht das Rad neu erfinden. – Soviut

0

Für High-Level-Datei-Operationen wie das verwenden, um die shutil Modul und in Ihrem Fall der copytree Funktion. Ich denke, das ist sauberer als "Diffuse" zu "missbrauchen".

UPDATE:: Vergessen Sie die Antwort, ich habe übersehen, dass das OP Shutil versucht.

+1

Ich erwähnte in meiner Frage, dass shutyl.copytree() ist, was ich versuchte zu verwenden, aber nicht die Rechnung. – Soviut

+1

Normalerweise würde ich damit einverstanden sein, aber es tut nicht ganz, was der O.P gefragt hat. –

+1

Ihr habt recht, ich habe das in der Frage übersehen, war zu spät an diesem Abend :-) –

0

Erhalten Sie den Fehler, der besagt "Kann ein Verzeichnis nicht erstellen, wenn es bereits vorhanden ist"? Ich bin nicht sicher, wie viel albern das ist, aber alles, was ich tat, war eine einzige Zeile in copytree Modul einzufügen: I geändert:

def copytree(src, dst, symlinks=False): 
    names = os.listdir(src) 
    os.makedirs(dst) 

in:

def copytree(src, dst, symlinks=False): 
    names = os.listdir(src) 
    if (os.path.isdir(dst)==False): 
     os.makedirs(dst)  

Ich denke, ich einige tat blöder. Wenn ja, könnte mir jemand darauf hinweisen? Sorry, ich bin sehr neu in Python: P