Ich habe in die Python- os
Oberfläche geschaut , konnte jedoch keine Methode zum Verschieben einer Datei finden. Wie würde ich das Äquivalent von $ mv ...
in Python tun ?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
python
file
file-handling
David542
quelle
quelle
mv
Befehl von gnu-coreutils vertraut sind , hat Pythonshutil.move
einen Randfall, in dem sich dieshutil.move
Funktion unterscheidet. Hier finden Sie alle Informationen . Kurz gesagt, Pythonsshutil.move
löst eine Ausnahme aus (Gnu-Coreutilsmv
jedoch nicht), wenn Ihr Ziel ein Verzeichnis ist und das Verzeichnis bereits eine Datei mit demselben Namen wie die Quelle enthält (weitere Informationen finden Sie unter dem im vorherigen Satz angegebenen Link ).os.system("mv file1 file2")
?Antworten:
os.rename()
,shutil.move()
Oderos.replace()
Alle verwenden dieselbe Syntax:
Beachten Sie, dass Sie den Dateinamen (
file.foo
) sowohl in das Quell- als auch in das Zielargument aufnehmen müssen. Wenn es geändert wird, wird die Datei umbenannt und verschoben.Beachten Sie auch, dass in den ersten beiden Fällen das Verzeichnis, in dem die neue Datei erstellt wird, bereits vorhanden sein muss. Unter Windows darf eine Datei mit diesem Namen nicht vorhanden sein, da sonst eine Ausnahme
os.replace()
ausgelöst wird. Eine Datei wird jedoch auch in diesem Fall stillschweigend ersetzt.Wie in Kommentaren zu anderen Antworten erwähnt, wird in den meisten Fällen
shutil.move
einfach angerufenos.rename
. Befindet sich das Ziel jedoch auf einer anderen Festplatte als die Quelle, wird stattdessen die Quelldatei kopiert und anschließend gelöscht.quelle
shutil.move
funktioniert für Verzeichnisse. Sie können relativen Pfadshutil.move(f.name, "tmp/")
oder vollständigen Pfad verwendenshutil.move(f.name, "/Users/hello/tmp/")
, nicht~
im Pfad verwenden, überprüft in Python2.7.9, Mac OS X.~
ist ein Shell-Konstrukt und hat nichts mit Dateipfaden an sich zu tun, außer als falsch platzierte Konvention. Wenn Sie Ihr Home-Verzeichnis wirklich einbeziehen möchten, verwenden Sie esos.getenv('HOME')
stattdessen und verknüpfen Sie es gegebenenfalls mit Teilen Ihres gewünschten Pfads.os.path.expanduser()
können das '~
' jederzeit nach os-spezifischen Regeln richtig erweitern . Viel ordentlicher, da%HOME%
es unter Windows nicht immer eingestellt ist.os.rename
verarbeitet keine Dateien auf verschiedenen Geräten. Verwendenshutil.move
Sie diese Option, wenn Sie nicht sicher sind, ob sich die Quell- und die Zieldatei auf demselben Gerät befinden.Obwohl
os.rename()
undshutil.move()
werden beide Dateien umbenennen, lautet der Befehl, der dem Unix-Befehl mv am nächsten kommtshutil.move()
. Der Unterschied besteht darin, dassos.rename()
dies nicht funktioniert, wenn sich Quelle und Ziel auf unterschiedlichen Datenträgern befinden, währendshutil.move()
es egal ist, auf welchem Datenträger sich die Dateien befinden.quelle
shutil.move()
wird verwendet,os.rename()
wenn sich das Ziel im aktuellen Dateisystem befindet. Andernfalls wirdshutil.move()
die Quelle mithilfe von in das Ziel kopiertshutil.copy2()
und anschließend entfernt.shutil.copy2()
nicht alle Dateimetadaten kopiert werden können. Wenn dies passiert, ist es so,cp -p
und dannrm
sammle ich.Für os.rename oder shutil.move müssen Sie das Modul importieren. Es ist kein * Zeichen erforderlich, um alle Dateien zu verschieben.
Wir haben einen Ordner unter / opt / awesome namens source mit einer Datei namens awesome.txt.
Wir haben os.listdir verwendet, um festzustellen, dass sich der Ordnername tatsächlich geändert hat. Hier ist das Shutil, das das Ziel zurück zur Quelle verschiebt.
Diesmal habe ich im Quellordner nachgesehen, ob die von mir erstellte Datei awesome.txt vorhanden ist. Es ist dort :)
Jetzt haben wir einen Ordner und seine Dateien von einer Quelle zu einem Ziel und wieder zurück verschoben.
quelle
Nach Python 3.4 können Sie die
pathlib
Klasse auchPath
zum Verschieben von Dateien verwenden.https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename
quelle
Dies ist, was ich im Moment benutze:
Jetzt voll funktionsfähig. Hoffe das hilft dir.
Bearbeiten:
Ich habe daraus eine Funktion gemacht, die ein Quell- und Zielverzeichnis akzeptiert, den Zielordner erstellt, falls er nicht vorhanden ist, und die Dateien verschiebt. Ermöglicht auch das Filtern der src-Dateien. Wenn Sie beispielsweise nur Bilder verschieben möchten, verwenden Sie das Muster
'*.jpg'
. Standardmäßig wird alles im Verzeichnis verschobenquelle
os.path.join(parent_path, filename)
anstelle der Verkettung von Zeichenfolgen plattformübergreifende Probleme zu verwendenDie akzeptierte Antwort ist nicht die richtige, da es bei der Frage nicht darum geht, eine Datei in eine Datei umzubenennen, sondern viele Dateien in ein Verzeichnis zu verschieben.
shutil.move
wird die Arbeit erledigen, ist aber für diesen Zweckos.rename
nutzlos (wie in den Kommentaren angegeben), da das Ziel einen expliziten Dateinamen haben muss.quelle
os.path.basename(my_file_path)
und die Dateiverzeichnisse mit abrufenos.path.dirname(my_file_path)
. Außerdem wurde vom OP nicht sehr deutlich gemacht, ob er mehrere Dateien verschieben wollte. Er erwähnte das Verschieben nur einer Datei in der Frage, aber sein Beispielcode implizierte das Verschieben mehrerer Dateien.Basierend auf der hier beschriebenen Antwort ist die Verwendung
subprocess
eine weitere Option.Etwas wie das:
Ich bin gespannt auf die Vor- und Nachteile dieser Methode im Vergleich zu
shutil
. Da ich in meinem Fall bereitssubprocess
aus anderen Gründen benutze und es zu funktionieren scheint, neige ich dazu, mich daran zu halten.Ist es vielleicht systemabhängig?
quelle
mv
erfolgreiche Verwendung unter einem Windows-Betriebssystem.Dies ist eine Lösung, die die
shell
Verwendung nicht ermöglichtmv
.quelle
andere Platte ex. C: -> D:
quelle
f"{new_path}{f}"
Sie jedoch keinen statischen Text in Ihrem String haben, ist dies möglicherweise mehr Arbeit. Ich habe versucht, mich an die Gewohnheit zu gewöhnen F-Saiten allerdings.