Wie kann ich das Äquivalent von tun mv
in Python?
mv "path/to/current/file.foo" "path/to/new/destination/for/file.foo"
David542
Wie kann ich das Äquivalent von tun mv
in Python?
mv "path/to/current/file.foo" "path/to/new/destination/for/file.foo"
ig0774
os.rename()
, os.replace()
oder shutil.move()
Alle verwenden die gleiche Syntax:
import os
import shutil
os.rename("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
os.replace("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
shutil.move("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
"file.foo"
) müssen sowohl im Quell- als auch im Zielargument enthalten sein. Wenn es Unterschiede zwischen den beiden gibt, wird die Datei sowohl umbenannt als auch verschoben.os.replace()
wird eine Datei auch in diesem Fall stillschweigend ersetzen.shutil.move
ruft einfach an os.rename
in den meisten Fällen. Wenn sich das Ziel jedoch auf einem anderen Datenträger als die Quelle befindet, wird stattdessen die Quelldatei kopiert und dann gelöscht.Bin ich der einzige, der denkt, dass os.rename nicht für Verzeichnisse funktioniert? Ich zitiere: “Wenn dst ein Verzeichnis ist, wird OSError ausgelöst.”
– Fabian
23. Juni 2014 um 20:11 Uhr
shutil.move
funktioniert für Verzeichnisse. Sie können den relativen Pfad verwenden shutil.move(f.name, "tmp/")
oder vollständiger Pfad shutil.move(f.name, "/Users/hello/tmp/")
, verwende nicht ~
im Pfad, eingecheckt in python2.7.9, Mac OS X.
– warumistjung
21. April 2015 um 2:26 Uhr
~
ist ein Shell-Konstrukt und hat nichts mit Dateipfaden an sich zu tun, außer als unangebrachte Konvention. Wenn Sie Ihr Home-Verzeichnis wirklich einbeziehen möchten, verwenden Sie os.getenv('HOME')
Verketten Sie ihn stattdessen bei Bedarf mit Teilen Ihres gewünschten Pfads.
– Armen Michaeli
24. Juli 2015 um 13:11 Uhr
Könntest du immer gebrauchen os.path.expanduser()
um die ‘ richtig zu erweitern~
‘ nach betriebssystemspezifischen Regeln. Seitdem viel ordentlicher %HOME%
ist unter Windows nicht immer eingestellt.
– ig0774
24. Juli 2015 um 15:27 Uhr
os.rename
verarbeitet keine Dateien auf verschiedenen Geräten. Verwenden shutil.move
wenn Sie sich nicht sicher sind, ob sich Quell- und Zieldatei auf demselben Gerät befinden.
– Giuseppe Scrivano
6. März 2017 um 11:44 Uhr
Jim Calfas
Obwohl os.rename()
Und shutil.move()
beide Dateien umbenennen, ist der Befehl, der dem Unix-Befehl mv am nächsten kommt shutil.move()
. Der Unterschied ist das os.rename()
funktioniert nicht, wenn sich Quelle und Ziel auf verschiedenen Festplatten befinden, während shutil.move()
ist unabhängig von der Dateifestplatte.
shutil.move()
Verwendet os.rename()
wenn das Ziel auf dem aktuellen Dateisystem liegt. Ansonsten, shutil.move()
kopiert die Quelle zum Ziel mit shutil.copy2()
und entfernt dann die Quelle.
– fmalina
21. Januar 2014 um 20:01 Uhr
Achten Sie darauf, das zu erkennen shutil.copy2()
kann nicht alle Datei-Metadaten kopierenalso wenn das passiert, ist es wie tun cp -p
und dann rm
Ich sammle.
– 2rs2ts
1. April 2014 um 22:01 Uhr
Beachten Sie: shutdown.move in Python 2.7.3 schlägt fehl, wenn das Ziel bereits vorhanden ist. Wenn das also möglich ist, fangen Sie entweder den Fehler ab oder entfernen Sie die Datei/das Verzeichnis manuell und führen Sie dann den Umzug durch.
– Dana
29. Mai 2014 um 17:44 Uhr
MondFrucht
Nach Python 3.4 können Sie auch verwenden pathlib
Klasse Path
Datei verschieben.
from pathlib import Path
Path("path/to/current/file.foo").rename("path/to/new/destination/for/file.foo")
https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename
Ich habe es kürzlich in Form von –> verwendet Path("path/to/current/file.foo").rename("path/to/new/destination/for/".joinpath(Path.name))
um alle *.LNK-Dateien (Verknüpfung) in ein DUMP-Verzeichnis zu verschieben. Lief wie am Schnürchen! 😀
– Amar
21. August 2020 um 0:30 Uhr
Dies funktioniert einwandfrei, schlägt jedoch fehl, wenn Sie die Datei von einem Gerät auf ein anderes verschieben möchten (Ungültiger geräteübergreifender Link).
– Capoti
22. September 2020 um 18:50 Uhr
@Amar vielleicht ist das besser. Path("path/to/current/file.foo").rename(Path("path/to/new/destination/for") / Path.name))
– Mondfrucht
16. April 2021 um 1:56 Uhr
jmontross
Für entweder die os.rename
oder shutil.move
Sie müssen das Modul importieren. NEIN *
Zeichen ist erforderlich, um alle Dateien zu verschieben.
Wir haben einen Ordner unter /opt/awesome
namens source mit einer Datei namens awesome.txt.
in /opt/awesome
○ → ls
source
○ → ls source
awesome.txt
python
>>> source="/opt/awesome/source"
>>> destination = '/opt/awesome/destination'
>>> import os
>>> os.rename(source, destination)
>>> os.listdir('/opt/awesome')
['destination']
Wir verwendeten os.listdir
um zu sehen, dass sich der Ordnername tatsächlich geändert hat. Hier ist die shutil
Verschieben des Ziels zurück zur Quelle.
>>> import shutil
>>> source="/opt/awesome/destination"
>>> destination = '/opt/awesome/source'
>>> shutil.move(source, destination)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']
Dieses Mal habe ich im Quellordner nachgesehen, um sicherzugehen, dass dies der Fall ist awesome.txt
Datei, die ich erstellt habe, existiert. Es ist dort
Jetzt haben wir einen Ordner und seine Dateien von einer Quelle zu einem Ziel und wieder zurück verschoben.
Peter Vlar
Das verwende ich im Moment:
import os, shutil
path = "/volume1/Users/Transfer/"
moveto = "/volume1/Users/Drive_Transfer/"
files = os.listdir(path)
files.sort()
for f in files:
src = path+f
dst = moveto+f
shutil.move(src,dst)
Sie können dies auch in eine Funktion umwandeln, die ein Quell- und Zielverzeichnis akzeptiert, den Zielordner erstellt, falls er nicht existiert, 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'
verschiebt es standardmäßig alles im Verzeichnis
import os, shutil, pathlib, fnmatch
def move_dir(src: str, dst: str, pattern: str="*"):
if not os.path.isdir(dst):
pathlib.Path(dst).mkdir(parents=True, exist_ok=True)
for f in fnmatch.filter(os.listdir(src), pattern):
shutil.move(os.path.join(src, f), os.path.join(dst, f))
Sie können dies leicht in einen gefilterten Zug umwandeln, indem Sie fnmatch.filter() verwenden, siehe meine Bearbeitung. Außerdem ist es am besten zu verwenden os.path.join(parent_path, filename)
anstelle der Zeichenfolgenverkettung, um plattformübergreifende Probleme zu vermeiden
– iggy12345
20. März 2019 um 21:13 Uhr
Javier Palacios
Die akzeptierte Antwort ist nicht die richtige, da es nicht darum geht, eine Datei in eine Datei umzubenennen, sondern viele Dateien in ein Verzeichnis zu verschieben. shutil.move
wird die Arbeit erledigen, aber zu diesem Zweck os.rename
ist nutzlos (wie in den Kommentaren angegeben), da das Ziel einen expliziten Dateinamen haben muss.
Sie können dies leicht in einen gefilterten Zug umwandeln, indem Sie fnmatch.filter() verwenden, siehe meine Bearbeitung. Außerdem ist es am besten zu verwenden os.path.join(parent_path, filename)
anstelle der Zeichenfolgenverkettung, um plattformübergreifende Probleme zu vermeiden
– iggy12345
20. März 2019 um 21:13 Uhr
Suraj Rao
Da Ihnen der Rückgabewert egal ist, können Sie dies tun
import os
os.system("mv src/* dest/")
für die von euch vertraut gnu-coreutils’
mv
BefehlPythonsshutil.move
hat einen Grenzfall, woshutil.move
Funktion unterscheidet. Gehen Sie hier für die vollständige Beschreibung. Kurz gesagt, Pythonsshutil.move
löst eine Ausnahme aus (aber gnu-coreutilsmv
wird 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).– Trevor Boyd Smith
11. August 2017 um 12:22 Uhr