Python-Windows-Datei-Kopieren mit Wildcard-Unterstützung
Habe ich das die ganze Zeit:
result = subprocess.call(['copy', '123*.xml', 'out_folder\\.', '/y'])
if result == 0:
do_something()
else:
do_something_else()
Bis ich heute angefangen zu schauen in pywin32-Module, dann sah ich Funktionen wie win32file.CopyFiles(), aber dann fand ich es nicht unterstützen das kopieren von Dateien zu einem Verzeichnis. Vielleicht ist diese Funktionalität irgendwo versteckt, aber ich habe diese noch nicht gefunden haben.
Ich habe auch versucht "glob" und "shutil" Kombination, aber "glob" ist unglaublich langsam, wenn es viele Dateien.
So, wie Sie emulieren das Windows-Eingabeaufforderung mit Python?
copy 123*.xml out_folder\. /y
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende code stellt eine portable Implementierung.
Hinweis, dass ich mit iglob (Hinzugefügt in Python 2.5) erzeugt ein generator, so dass es nicht laden Sie die ganze Liste der Dateien im Speicher der ersten (das ist das, was Klumpen hat).
Zusätzliche Dokumentation:
copyfile
? warum nicht einfachcopy
?Beispiel unten ist ziemlich naiv - nicht die Kontrolle, wenn etwas schief geht, und erstellt keine Verzeichnisse, sondern könnten tun, was Sie wollen:
Siehe auch: http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html
Mit win32file/SHFileOperation kopieren scheint zu sein, mehr funktionstüchtig, aber sind nicht tragbar und sind komplizierter zu bedienen.
Blick auf glob und shutil bevor es weiter gehen kann.
Forking einem Teilprozess um eine Datei zu kopieren ist relativ ineffizient. Mit
shutil
wird effizienter.glob langsam ist, gibt es eine Menge von Ergebnissen, denn es gibt eine riesige Liste aller Ergebnisse in einem "big bang" - Ansatz. Wenn es eine Menge von Ergebnissen, die diese verwenden eine Menge Speicher, und nehmen Sie eine lange Zeit.
Verwenden, iglob, statt, wie vorgeschlagen, von einem vorherigen poster. iglob Konstrukte und gibt ein iterator-Objekt, das verwendet werden kann, um eine Schleife über die Ergebnisse, ohne Sie alle in den Speicher in der gleichen Zeit. Es ist viel effektiver, wenn es eine Menge von matches.
In der Regel, Wann immer Sie code schreiben, wie "für x in [glob.glob ...]" sollten Sie passen.iglob statt.