Dateien und Ordner
Übersicht
• Existenz einer Datei bzw. eines Ordners prüfen
• Objekttyp ermitteln
• Objekteigenschaften ermitteln
• Zugriffsrechte ermitteln
• Zugriffsrechte ändern
• Datei erzeugen
• Datei schreiben
• Datei lesen
• Datei an konkreter Position schreiben bzw. lesen
• Datei umbenennen/verschieben
• Datei kopieren
• Datei leeren
• Datei löschen
• Ordner anlegen
• Ordnerinhalt auslesen
• Ordner umbenennen/verschieben
• Ordner kopieren
• Ordner löschen
Mit Python kann auf Dateien und Ordner des aktuellen Dateisystems sowohl lesend als auch schreibend zugegriffen werden. Welche Möglichkeiten es hier gibt und wie diese realisiert werden, soll in diesem Abschnitt beschrieben werden. An dieser Stelle sei darauf hingewiesen, dass die Angaben zu Pfaden den unter unixoiden Betriebssystemen wie Linux gültigen Konventionen folgen. Ob Pfade beispielsweise unter Windows in gleicher Weise gebildet werden, entzieht sich meiner Kenntnis.
Für die folgenden Operationen werden die Module os bzw. shutil benötigt.
Existenz einer Datei bzw. eines Ordners prüfen
► Python-Dokumentation: os.environ os.path.exists
Bevor auf eine Datei oder einen Ordner eine Aktion angewendet wird, wird man häufig zunächst feststellen wollen, ob dieses Objekt überhaupt existiert. Dazu wird die Funktion path.exists() aus dem Modul os verwendet. Diese Funktion findet auch Objekte, die einem anderen Besitzer gehören oder für die keine Zugriffsrechte bestehen.
1 2 3 4 5 6 7 |
|
Objekttyp ermitteln
► Python-Dokumentation: os.path.isfile os.path.isdir os.path.islink
Möchte man wissen, ob es sich bei einem gefundenen Objekt um eine Datei, einen Ordner oder beispielsweise um einen Symlink handelt, kann man die Funktionen os.path.isfile(), os.path.isdir() sowie os.path.islink() verwenden:
1 2 3 4 5 6 7 |
|
Objekteigenschaften ermitteln
► Python-Dokumentation: os.stat
Über die Funktion stat aus dem Modul os lassen sich diverse Eigenschaften von Ordnern bzw. Dateien ermitteln. Die Funktion gibt ein Tupel zurück, aus dem die Eigenschaften über den entsprechenden Index ausgelesen werden können.
Ebenso kann ein Wert über das zugehörige Schlüsselwort abgefragt werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Zugriffsrechte ermitteln
► Python-Dokumentation: os.stat os.access
Dass ein Objekt existiert ist noch keine Garantie dafür, dass man auch Lese- oder Schreibzugriff darauf hat. Die bestehenden Zugriffsrechte können mit os.stat(path).st_mode ermittelt werden. Eine einfache Überprüfung des Lese- oder Schreibzugriffs kann mit der Funktion os.access() durchgeführt werden.
1 2 3 4 5 6 7 8 9 10 11 |
|
Zugriffsrechte ändern
► Python-Dokumentation: os.chmod
Um die Zugriffsrechte eines Objekts zu ändern, wird die Methode os.chmod() verwendet. Der Modus kann in einem beliebigen Zahlensystem angegeben werden:
1 2 3 |
|
Um die Schreibweise rwx in eine Dezimalzahl umzuwandeln, kann folgende Funktion verwendet werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Datei erzeugen
► Python-Dokumentation: open
Um eine leere Datei zu erzeugen, genügt es, mit open(path, "w") eine neues Dateiobjekt zu generieren und dieses gleich wieder zu schließen. Dies setzt natürlich Schreibzugriff auf das Zielverzeichnis voraus.
1 2 3 |
|
Datei schreiben
► Python-Dokumentation: open Reading and Writing Files
Mit der Funktion open() wird ein Dateiobjekt generiert, auf das lesend oder schreibend zugegriffen werden kann. Als erstes Argument wird der Pfad zur betreffenden Datei übergeben, als zweites Argument der Modus. Die Modi zum Schreiben sind:
"w": Datei wird beim Öffnen geleert.
"a": Datei wird um die in sie zu schreibenden Daten erweitert.
Anmerkung: Das Zeichen \n steht für einen Zeilenvorschub.
1 2 3 4 5 6 7 |
|
► Python-Dokumentation: writelines
Mit der Funktion writelines() lassen sich beispielsweise die Elemente einer Liste zeilenweise in eine Datei schreiben:
1 2 3 4 5 |
|
Datei lesen
► Python-Dokumentation: open Reading and Writing Files
Zum Lesen wird das Dateiobjekt mit dem Modus "r" geöffnet (kann auch weggelassen werden). Es stehen verschiedene Möglichkeiten zur Verfügung, den Inhalt einer Textdatei auszulesen:
Mit Hilfe von read() wird der gesamte Dateiinhalt in eine Variable gelesen. readline() ließt eine einzelne Zeile aus der Datei.
Die Funktion readlines() erzeugt eine Liste mit den Zeilen des Dateiinhalts als Elemente. Diese Elemente können dann in einer Schleife ausgelesen werden.
Es ist hierbei zu beachten, dass das Zeichen für den Zeilenvorschub \n am Ende einer Zeile Teil der Zeile ist und bei Bedarf entfernt werden muss. Im Beispiel erzeugt die Funktion print() ohnehin einen Zeilenvorschub.
Weiterhin ist zu beachten, dass zwischen dem Öffnen und dem Schließen eines Dateiobjekts der Inhalt nur ein Mal ausgelesen werden kann. Für ein erneutes Lesen muss das Dateiobjekt daher erst geschlossen und dann erneut geöffnet werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Datei an konkreter Position schreiben bzw. lesen
► Python-Dokumentation: Reading and Writing Files
Mit der Funktion seek() lässt sich ein Zeiger auf eine bestimmte Position innerhalb einer Datei setzen, an der diese Datei geschrieben bzw. gelesen werden kann.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Datei umbenennen/verschieben
► Python-Dokumentation: os.rename os.renames
Mit os.rename() lässt sich eine existierende Datei umbenennen bzw. verschieben. Weichen die Elternordner des Zielpfades von dem des Quellpfades ab (d. h., die Datei wird nicht umbenannt, sondern verschoben) und existiert mindestens ein Ordner des Zielpfades nicht, so führt dies zu einem OSError. In diesem Fall kann os.renames() verwendet werden, um nicht existierende Ordner im Zielpfad zu erzeugen.
Falls unter dem Zielpfad bereits eine Datei gleichen Namens existiert, so wird diese stillschweigend überschrieben. Existiert bereits ein Ordner mit dem Namen des Zielpfades, so führt dies zu einem OSError.
Siehe auch os.replace und shutil.move.
1 2 3 4 5 6 7 8 9 |
|
Datei kopieren
► Python-Dokumentation: shutil.copy shutil.copy2
Um eine Datei an einen anderen Ort zu kopieren, kann man die Methode copy aus dem Modul shutil verwenden. Falls man Wert darauf legt, dass die Metadaten der Datei erhalten bleiben (wie beispielsweise der Zeitpunkt, an dem die Datei erzeugt bzw. zuletzt geändert wurde), so muss man die Methode copy2 verwenden.
Sollte mindestens ein Ordner des Zielpfades nicht existieren, so führt dies zu einem IOError.
Siehe auch shutil.copyfile.
1 2 3 4 5 6 |
|
Datei leeren
Um eine Datei zu leeren, ohne sie zu löschen, kann man sie im Schreibmodus öffnen (wobei sie automatisch geleert wird) und daraufhin gleich wieder schließen.
1 2 |
|
Datei löschen
► Python-Dokumentation: os.remove os.unlink
Um eine Datei zu löschen, verwendet man die Methode remove aus dem Modul os. Dies ist identisch mit der Methode os.unlink.
1 2 |
|
Ordner anlegen
► Python-Dokumentation: os.mkdir os.makedirs
Um einen neuen Ordner anzulegen, verwendet man die Methode mkdir aus dem Modul os. Sollte mindestens ein Ordner des Zielpfades nicht existieren, so führt dies zu einem OSError. In diesem Fall verwendet man die Methode os.makedirs, um fehlende Ordner ebenfalls anzulegen.
Sollte der gewünschte Ordner bereits existieren, so führt dies ebenfalls zu einem OSError.
1 2 3 4 5 |
|
Ordnerinhalt auslesen
► Python-Dokumentation: os.listdir
Um den Inhalt eines Ordners auszulesen, verwendet man die Methode listdir aus dem Modul os. Die Reihenfolge der zurückgegebenen Objektnamen ist beliebig, weshalb es unter Umständen empfehlenswert sein kann, die zurückgegebene Liste zunächst mit sort() zu sortieren.
1 2 3 4 5 |
|
Möchte man den Ordnerinhalt nur nach bestimmten enthaltenen Objekten (Dateien, Ordner oder Symlinks) auslesen, so kann man sich mit folgender Funktion behelfen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Eine alternative Methode zum Auslesen eines Ordners bietet die Funktion glob aus dem gleichnamigen Modul.
1 2 3 4 5 6 7 |
|
Ordner umbenennen/verschieben
► Python-Dokumentation: os.rename os.renames
Mit os.rename() lässt sich ein existierender Ordner umbenennen bzw. verschieben. Weichen die Elternordner des Zielpfades von dem des Quellpfades ab (d. h., der Ordner wird nicht umbenannt, sondern verschoben) und existiert mindestens ein Ordner des Zielpfades nicht, so führt dies zu einem OSError. In diesem Fall kann os.renames() verwendet werden, um nicht existierende Ordner im Zielpfad zu erzeugen.
Falls unter dem Zielpfad bereits ein Ordner gleichen Namens existiert, so wird dieser stillschweigend überschrieben, sofern dieser leer ist. Ansonsten führt der Versuch zu einem OSError. Existiert bereits eine Datei mit dem Namen des Zielpfades, so führt dies ebenfalls zu einem OSError.
Siehe auch os.replace und shutil.move.
1 2 3 4 5 6 7 8 9 10 |
|
Ordner kopieren
► Python-Dokumentation: shutil.copytree
Um einen Ordner mit allen enthaltenen Objekten an einen anderen Ort zu kopieren, wird die Methode copytree aus dem Modul shutil verwendet. Nicht vorhandene Ordner des Zielpfades werden hierbei automatisch erzeugt. Existiert bereits eine Datei oder ein Ordner mit dem Namen des Zielpfades, so führt dies zu einem OSError.
Die Metadaten der enthaltenen Ordner und Dateien werden beibehalten. Sollen die Metadaten der enthaltenen Dateien neu geschrieben werden, so übergibt man zusätzlich das Argument copy_function=shutil.copy.
1 2 3 4 5 6 |
|
Ordner löschen
► Python-Dokumentation: os.rmdir shutil.rmtree
Um einen leeren Ordner zu löschen, verwendet man die Methode rmdir aus dem Modul os. Der Versuch, einen nicht leeren Ordner mit dieser Methode zu löschen, führt zu einem OSError.
Um einen Ordner mit allen enthaltenen Objekten zu löschen, verwendet man die Methode rmtree aus dem Modul shutil.
1 2 3 4 5 |
|