31.3 Zugriff auf das Dateisystem – shutil 

Das Modul shutil ist als Ergänzung zu os und os.path anzusehen und enthält Funktionen, die insbesondere das Kopieren und Entfernen von Dateien betreffen. Dabei wird von den plattformspezifischen Programmen wie beispielsweise copy unter Windows oder cp unter Unix abstrahiert.
Mit Python 3.2 sind außerdem Funktionen zum Erzeugen und Entpacken von Archivdateien (wie ZIP- oder TAR-Archiven) hinzugekommen.
Folgende Funktionen werden von shutil implementiert, wobei die Parameter src und dst jeweils Strings sind, die den Pfad der Quell- bzw. der Zieldatei enthalten:
Name | Beschreibung |
---|---|
Verzeichnis- und Dateioperationen | |
chown(path, [user, group]) | Setzt den Eigentümer und die Gruppe von path auf die übergebenen Werte user bzw. group. |
copy(src, dst, [follow_symlinks]) | Kopiert die Datei unter dem Pfad src nach dst. Im Unterschied zu copyfile kann dst dabei auch auf ein Verzeichnis verweisen, in das die Datei kopiert werden soll. |
copyfile(src, dst, [follow_symlinks]) | Kopiert die Datei unter src nach dst. Wenn die Datei unter dst bereits existiert, wird sie ohne Rückfrage überschrieben. Dabei muss der Pfad dst schreibbar sein. Ansonsten wird eine PermissionError-Exception geworfen. |
copyfileobj(fsrc, fdst, [length]) | Kopiert den Inhalt des zum Lesen geöffneten Dateiobjekts fsrc in das zum Schreiben geöffnete fdst-Objekt. |
copymode(src, dst, [follow_symlinks]) |
Kopiert die Zugriffsrechte vom Pfad src auf den Pfad dst. Dabei bleiben der Inhalt von dst sowie der Besitzer und die Gruppe unangetastet. Beide Pfade müssen bereits im Dateisystem existieren. |
copystat(src, dst, [follow_symlinks]) | Wie copymode, aber es werden zusätzlich die Zeiten für den letzten Zugriff in die letzte Modifikation kopiert. |
copy2(src, dst, [follow_symlinks]) | Wie copy, aber es werden zusätzlich die Zeiten des letzten Zugriffs und der letzten Änderung kopiert. |
copytree(src, dst, [symlinks ignore, copy_function, ignore_dangling_symlinks]) | Kopiert die gesamte Verzeichnisstruktur unter src nach dst. |
disk_usage(path) | Gibt Informationen über die Speicherkapazität, Belegung und den freien Speicher unter path als Tupel zurück. |
ignore_patterns([*patterns]) | Erzeugt eine Funktion, die bei der copytree-Funktion für den Parameter ignore übergeben werden kann, um bestimmte Dateien vom Kopieren auszuschließen. |
move(src, dst) | Verschiebt die Datei oder den Ordner von src nach dst. |
rmtree(src, [ignore_errors, onerror]) | Löscht die gesamte Verzeichnisstruktur unter src. |
which(cmd, [mode, path]) | Gibt den Pfad der ausführbaren Datei zurück, die zum Kommando cmd gehört. |
Archivoperationen | |
make_archive(base_name, format, [root_dir]) | Erzeugt eine Archivdatei, in der Dateien im Verzeichnis root_dir enthalten sind, und gibt den Namen des Archivs zurück. |
get_archive_formats() | Gibt eine Liste der verfügbaren Archivformate zum Erzeugen von Archiven zurück. |
get_unpack_formats() | Gibt eine Liste verfügbarer Archivformate zum Entpacken von Archiven zurück. |
unpack_archive(filename, [extract_dir, format]) | Entpackt das Archiv unter filename in das Verzeichnis extract_dir. |
Tabelle 31.5 Funktionen des Moduls shutil
Im Folgenden werden zunächst die Funktionen für Verzeichnisse und Dateien und danach die Archivoperationen im Detail besprochen. Um die aufgeführten Beispiele ausführen zu können, muss zunächst das Modul shutil eingebunden werden:
>>> import shutil
31.3.1 Verzeichnis- und Dateioperationen 

copy(src, dst [follow_symlinks])
Diese Operation kopiert die Datei unter dem Pfad src nach dst. Der Parameter dst kann dabei einen Pfad zu einer Datei enthalten, die dann erzeugt oder überschrieben wird. Verweist dst auf einen Ordner, wird eine neue Datei mit dem Dateinamen von src im Ordner dst erzeugt oder gegebenenfalls überschrieben. Dies ist der wesentliche Unterschied zur Funktion copyfile, die keinen Ordner als Ziel akzeptiert.
Die Zugriffsrechte werden mitkopiert.
Hat der Parameter follow_symlinks den Wert False, werden symbolische Links selbst kopiert, während der Standardwert True dafür sorgt, dass anstelle eines symbolischen Links die davon referenzierte Datei kopiert wird.
copytree(src, dst, [symlinks, ignore, copy_function, ignore_dangling_symlinks])
Diese Operation kopiert die gesamte Verzeichnisstruktur unter src nach dst. Der Pfad dst darf dabei nicht auf einen bereits existierenden Ordner verweisen, und es werden alle fehlenden Verzeichnisse des Pfades dst erzeugt.
Der optionale Parameter symlinks gibt an, wie mit symbolischen Links verfahren werden soll. Hat symlinks den Wert False oder wird symlinks nicht angegeben, werden die verlinkten Dateien oder Ordner selbst in die kopierte Verzeichnisstruktur eingefügt. Bei einem symlinks-Wert von True werden nur die Links kopiert. Falls symlinks den Wert False hat und der Parameter ignore_dangling_symlinks auf True gesetzt ist, werden Fehler ignoriert, die auftreten, falls ein symbolischer Link auf eine nicht vorhandene Datei zeigt.
Der Parameter ignore erwartet eine Funktion, die bestimmte Dateien vom Kopieren ausschließt. Die Funktion ignore_patterns dient dazu, eine solche Funktion zu erzeugen. Das folgende Beispiel erzeugt eine Funktion, mit der alle auf ".txt" endenden Dateinamen aussortiert werden. Außerdem werden Dateinamen ignoriert, die mit "tmp" beginnen.
>>> my_ignore_function = shutil.ignore_patterns("*.txt", "tmp*")
Für das Kopieren der Dateien wird die Funktion verwendet, die mit dem Parameter copy_function übergeben wird, wobei copy2 die Standardeinstellung ist.
Die Funktion copytree greift intern auf die Funktion copystat zurück, um die Rechte der erzeugten Verzeichnisse und Dateien zu setzen.
rmtree(src, [ignore_errors, onerror])
Hiermit wird die gesamte Verzeichnisstruktur unter src gelöscht. Für ignore_errors kann ein Wahrheitswert übergeben werden, der bestimmt, ob beim Löschen auftretende Fehler ignoriert oder von der Funktion, die für onerror übergeben wurde, behandelt werden sollen. Wird ignore_errors nicht angegeben, erzeugt jeder auftretende Fehler eine Exception.
Wenn Sie onerror angeben, muss es eine Funktion sein, die drei Parameter erwartet:
- function – eine Referenz auf die Funktion, die den Fehler verursacht hat. Dies können os.listdir, os.remove oder os.rmdir sein.
- path – der Pfad, für den der Fehler auftrat
- excinfo – der Rückgabewert von sys.exc_info im Kontext des Fehlers
[»] Hinweis
Exceptions, die von der Funktion onerror geworfen werden, werden nicht abgefangen.
31.3.2 Archivoperationen 

Für die folgenden Tests gehen wir davon aus, dass sich im aktuellen Arbeitsverzeichnis ein Verzeichnis namens daten befindet, das aufgebaut ist wie in Abbildung 31.2 gezeigt.
Abbildung 31.2 Beispieldaten für die Archivfunktionen
make_archive(base_name, format, [root_dir, base_dir, verbose, dry_run, owner, group, logger])
Diese Funktion erzeugt ein neues Archiv, das die Dateien im Verzeichnis root_dir enthält. Wird root_dir nicht angegeben, werden die Dateien des aktuellen Arbeitsverzeichnisses gepackt. Mit dem Parameter base_name werden der Speicherort und der Name der Archivdatei festgelegt, wobei die Dateiendung nicht mit angegeben werden sollte.
Über den Parameter format wird das gewünschte Format der Archivdatei angegeben. Die verfügbaren Archivformate können Sie mit der Funktion get_archive_formats ermitteln (siehe unten).
Ein typischer Aufruf von make_archive sieht folgendermaßen aus:
>>> shutil.make_archive("test", "zip", "daten")
'[…]/test.zip'
Mithilfe des Unix-Programms unzip sehen wir, dass das Archiv alle Dateien im Verzeichnis daten enthält:
computer ~ $ unzip -v test.zip
Archive: test.zip
Length Method Size Name
2 Defl:N 4 datei2.txt
2 Defl:N 4 datei3.txt
2 Defl:N 4 datei1.txt
2 Defl:N 4 unterordner1/datei5.txt
2 Defl:N 4 unterordner1/datei4.txt
2 Defl:N 4 unterordner2/datei6.txt
2 Defl:N 4 unterordner2/unterordner3/datei7.txt
Möchten Sie nur die Dateien eines Unterverzeichnisses von root_dir inklusive des zugehörigen relativen Pfades packen, können Sie dies mit dem Parameter base_dir erreichen.
Wir werden im folgenden Beispiel nur die Dateien im Unterverzeichnis unterordner2 packen, wobei jedoch der relative Pfad innerhalb des Verzeichnisses daten erhalten bleibt:
>>> shutil.make_archive("test2", "zip", "daten", "unterordner2")
'[…]/test2.zip'
Wieder überprüfen wir mithilfe von unzip den Inhalt des Archivs:
computer ~ $ unzip -v test2.zip
Archive: test2.zip
Length Method Size Name
2 Defl:N 4 unterordner2/datei6.txt
2 Defl:N 4 unterordner2/unterordner3/datei7.txt
Sie sehen, dass alle Dateien und Ordner im Verzeichnis unterordner2 gepackt worden sind, wobei der relative Pfad zum Verzeichnis daten, nämlich unterordner2, erhalten geblieben ist.
Für die technischen und selten gebrauchten Parameter verbose, dry_run, owner, group und logger verweisen wir Sie auf die Python-Dokumentation.
get_archive_formats()
Diese Funktion gibt eine Liste zweielementiger Tupel zurück, in denen die verfügbaren Formate zum Erstellen von Archiven beschrieben werden.
>>> shutil.get_archive_formats()
[('bztar', "bzip2'ed tar-file"),
('gztar', "gzip'ed tar-file"),
('tar', 'uncompressed tar file'),
('xztar', "xz'ed tar-file"),
('zip', 'ZIP file')]
Jedes Tupel in dieser Liste enthält zwei Strings: den Namen des Formats und eine kurze Beschreibung.
get_unpack_formats()
Diese Funktion arbeitet wie get_archive_formats, nur werden hier die verfügbaren Formate zum Entpacken von Archiven aufgelistet.
unpack_archive(filename, [extract_dir, format])
Diese Funktion entpackt das Archiv unter dem Pfad filename in das Zielverzeichnis extract_dir. Wird extract_dir nicht angegeben, werden die Daten in das aktuelle Arbeitsverzeichnis entpackt.
Mit dem Parameter format kann das Format des Archivs angegeben werden. Falls kein Wert für format übergeben wurde, versucht unpack_archive, das Format des Archivs anhand der Dateiendung zu ermitteln.