1350 Stimmen

Wie man eine Datei in Python verschiebt?

Wie würde ich das Äquivalent von mv src/* dest/ in Python machen?

>>> source_files = '/PFAD/ZU/ORDNER/*'
>>> destination_folder = 'PFAD/ZU/ORDNER'
>>> # Äquivalent zu $ mv source_files destination_folder

2011voto

ig0774 Punkte 36899

os.rename(), os.replace() oder shutil.move()

Alle verwenden die gleiche Syntax:

import os
import shutil

os.rename("Pfad/zur/aktuellen/datei.foo", "Pfad/zum/neuen/ziel/für/datei.foo")
os.replace("Pfad/zur/aktuellen/datei.foo", "Pfad/zum/neuen/ziel/für/datei.foo")
shutil.move("Pfad/zur/aktuellen/datei.foo", "Pfad/zum/neuen/ziel/für/datei.foo")

Beachten Sie, dass Sie den Dateinamen (datei.foo) in beiden Argumenten für Quelle und Ziel angeben müssen. Wenn sich der Dateiname ändert, wird die Datei sowohl umbenannt als auch verschoben.

Beachten Sie auch, dass im ersten beiden Fällen das Verzeichnis, in dem die neue Datei erstellt wird, bereits existieren muss. Auf Windows darf eine Datei mit diesem Namen nicht vorhanden sein, sonst wird eine Ausnahme ausgelöst, aber os.replace() ersetzt die Datei in diesem Fall stillschweigend.

Wie in Kommentaren zu anderen Antworten bereits erwähnt wurde, ruft shutil.move in den meisten Fällen einfach os.rename auf. Wenn das Ziel jedoch auf einem anderen Laufwerk als die Quelle liegt, wird stattdessen die Datei kopiert und dann die Quelldatei gelöscht.

318voto

Jim Calfas Punkte 3181

Auch wenn os.rename() und shutil.move() beide Dateien umbenennen, ist der Befehl, der dem Unix mv Befehl am nächsten kommt, shutil.move(). Der Unterschied besteht darin, dass os.rename() nicht funktioniert, wenn die Quelle und das Ziel auf verschiedenen Laufwerken liegen, während shutil.move() laufwerksunabhängig ist.

114voto

MoonFruit Punkte 1330

Nach Python 3.4 können Sie auch die Klasse Path von pathlib verwenden, um Dateien zu verschieben.

from pathlib import Path

Path("pfad/zur/aktuellen/datei.foo").rename("pfad/zum/neuen/ziel/für/datei.foo")

https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename

41voto

jmontross Punkte 3445

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 namens source unter /opt/awesome 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 haben os.listdir verwendet, um zu sehen, dass der Ordnername tatsächlich geändert wurde. Hier wird mit shutil das Zurückverschieben des Ziels nach source durchgeführt.

>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']

Diesmal habe ich im Quellordner nachgesehen, um sicherzustellen, dass die von mir erstellte awesome.txt-Datei vorhanden ist. Es ist dort :)

Jetzt haben wir einen Ordner und dessen Dateien von einer Quelle zu einem Ziel verschoben und wieder zurück.

29voto

Peter Vlaar Punkte 417

Das ist das, was ich im Moment benutze:

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)

Jetzt voll funktionsfähig. Hoffe das hilft Ihnen.

Bearbeiten:

Ich habe das in eine Funktion umgewandelt, die ein Quell- und Zielverzeichnis akzeptiert, das Zielverzeichnis erstellt, falls es nicht vorhanden ist, und die Dateien verschiebt. Erlaubt auch eine Filterung der Quelldateien, zum Beispiel wenn Sie nur Bilder verschieben möchten, dann verwenden Sie das Muster '*.jpg', standardmäßig werden alle Dateien im Verzeichnis verschoben.

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))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X