Dateien in Python kopieren und verschieben: Arbeiten mit den Modulen shutil und os
In der Python-Entwicklung sind Datei- und Verzeichnisoperationen an der Tagesordnung. Ob Backups erstellen, Benutzer-Uploads verarbeiten, Projektstrukturen organisieren oder Anwendungen bereitstellen – all diese Aufgaben erfordern eine programmatische Steuerung des Dateisystems. Die Automatisierung solcher Vorgänge vereinfacht die Datenverwaltung erheblich und macht manuelle, sich wiederholende Schritte überflüssig.
Das Modul shutil in Python bietet hochwertige Werkzeuge für die Arbeit mit Dateien und Verzeichnissen. In Kombination mit dem Modul os entsteht ein leistungsstarkes, plattformunabhängiges Toolkit für flexible Dateisystem-Skripte. Beide Module sind Teil der Python-Standardbibliothek und benötigen keine zusätzliche Installation.
Überblick über das Modul shutil
Der Name shutil leitet sich von "shell utility" ab und stellt eine Sammlung von Funktionen für fortgeschrittene Datei- und Verzeichnisoperationen bereit. Zu den wichtigsten Funktionen gehören:
copy()– Kopieren einer Datei ohne Metadatencopy2()– Kopieren einer Datei mit vollständigen Metadatencopytree()– Rekursives Kopieren ganzer Verzeichnissemove()– Verschieben von Dateien und Ordnern an einen neuen Ortrmtree()– Rekursives Löschen von Verzeichnissen mit Inhaltcopyfileobj()– Byteweises Kopieren von Dateiobjekten
Das Modul shutil lässt sich nahtlos mit dem Modul os kombinieren und eignet sich sowohl für kleine Automatisierungsskripte als auch für große Unternehmensanwendungen.
Methoden zum Kopieren von Dateien
Basis-Kopieren mit shutil.copy()
Die Funktion shutil.copy() kopiert den Inhalt einer Datei, ohne die Metadaten zu übertragen:
import shutil
quelle = 'quellordner/beispiel.txt'
ziel = 'zielordner/beispiel.txt'
shutil.copy(quelle, ziel)
Diese Funktion kopiert nur den Dateiinhalt. Metadaten wie Erstellungsdatum, letzte Änderung und Zugriffsrechte bleiben unberücksichtigt. Die Funktion entspricht dem Befehl cp unter Unix/Linux ohne Flags zur Attributerhaltung.
Wichtig: Existiert das Zielverzeichnis nicht, führt dies zu einem Fehler. Es empfiehlt sich, vorher die Existenz des Zielordners zu prüfen oder ihn programmatisch zu erstellen.
Kopieren mit Metadaten: shutil.copy2()
Wenn alle Dateiinformationen – inklusive Zeitstempel, Besitzer und Zugriffsrechte – erhalten bleiben sollen, kommt copy2() zum Einsatz:
shutil.copy2('datei.txt', 'backup/datei.txt')
Diese Methode ist besonders nützlich für Backups, Projektmigrationen zwischen verschiedenen Systemen oder wenn die ursprünglichen Dateiattribute kritisch sind. copy2() sorgt für eine möglichst originalgetreue Kopie am neuen Speicherort.
Kopieren von Verzeichnissen
Rekursives Kopieren mit shutil.copytree()
Zum Kopieren ganzer Verzeichnisse mit allen Unterordnern und Dateien dient copytree():
shutil.copytree('altes_projekt', 'neues_projekt')
Standardmäßig löst copytree() einen FileExistsError aus, wenn das Zielverzeichnis bereits existiert. Seit Python 3.8 kann der Parameter dirs_exist_ok=True verwendet werden, um das Überschreiben oder Ergänzen von Inhalten zu erlauben:
shutil.copytree('altes_projekt', 'neues_projekt', dirs_exist_ok=True)
Die Funktion arbeitet rekursiv und wird in folgenden Szenarien eingesetzt:
- Klonen von Projektvorlagen