Wie verschiebe ich eine Datei in Python?

Lesezeit: 6 Minuten

Benutzeravatar von David542
David542

Wie kann ich das Äquivalent von tun mv in Python?

mv "path/to/current/file.foo" "path/to/new/destination/for/file.foo"

  • für die von euch vertraut gnu-coreutils’ mv BefehlPythons shutil.move hat einen Grenzfall, wo shutil.move Funktion unterscheidet. Gehen Sie hier für die vollständige Beschreibung. Kurz gesagt, Pythons shutil.move löst eine Ausnahme aus (aber gnu-coreutils mv 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


Benutzeravatar von ig0774
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")
  • Der Dateiname ("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.
  • Das Verzeichnis, in dem die neue Datei erstellt wird, muss bereits vorhanden sein.
  • Unter Windows darf eine Datei mit diesem Namen nicht existieren oder es wird eine Ausnahme ausgelöst, aber 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

Benutzeravatar von Jim Calfas
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 rmIch 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


Benutzeravatar von MoonFruit
MondFrucht

Nach Python 3.4 können Sie auch verwenden pathlibKlasse 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


Benutzeravatar von jmontross
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.

Benutzeravatar von Peter Vlaar
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


Benutzeravatar von Javier Palacios
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


Benutzeravatar von Suraj Rao
Suraj Rao

Da Ihnen der Rückgabewert egal ist, können Sie dies tun

import os
os.system("mv src/* dest/")

1449210cookie-checkWie verschiebe ich eine Datei in Python?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy