decocode decocode deco    

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.

Quelltext auswählen
1
2
3
4
5
6
7
import os

path = os.environ['HOME']  # der aktuelle Benutzerordner
if os.path.exists(path) == True:
    print(path, "existiert.")
else:
    print(path, "existiert nicht.")

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:

Quelltext auswählen
1
2
3
4
5
6
7
path = os.environ['HOME']  # der aktuelle Benutzerordner
if os.path.isdir(path) == True:
    print("Es ist ein Ordner.")
if os.path.isfile(path) == True:
    print("Es ist eine Datei.")
if os.path.islink(path) == True:
    print("Es ist ein Symlink.")

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.

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
path = os.environ['HOME'] + "/Python/test"
props = os.stat(path)
print("Protection Bits:", props[0])
print("Inode-Nummer:", props[1])
print("Gerätenummer:", props[2])
print("Anzahl der Hardlinks:", props[3])
print("Benutzer-ID des Besitzers (uid):", props[4])
print("Gruppen-ID des Besitzers (gid):", props[5])
print("Größe des Objekts in Bytes:", props[6])
print("Zeitstempel des letzten Zugriffs auf das Objekt (atime):", props[7])
print("Zeitstempel der letzten Änderung des Objekts (mtime):", props[8])
print("Zeitstempel der letzten Änderung der Metadaten des Objekts (ctime):", props[9])

# Abfrage über Schlüsselwort:
print("st_mode:", os.stat(path).st_mode)

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.

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
mode = os.stat(path).st_mode
print("Mode: ", oct(mode))

if os.access(path, os.R_OK):
    print("Leserechte bestehen.")
else:
    print("Leserechte bestehen nicht.")
if os.access(path, os.W_OK):
    print("Schreibrechte bestehen.")
else:
    print("Schreibrechte bestehen nicht.")

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:

Quelltext auswählen
1
2
3
mode = 0o775  # übliche Oktalschreibweise
mode = 509    # Dezimalschreibweise
os.chmod(path, mode)

Um die Schreibweise rwx in eine Dezimalzahl umzuwandeln, kann folgende Funktion verwendet werden:

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def rwx2dec(string):
    if len(string) != 9:
        return false
    else:
        val = 0
        for a in range(3):
            for p in range(3):
                if string[a * 3 + p] != "-":
                    val += (8 ** (2 - a)) * (2 ** (2 - p))
        return val

decmode = rwx2dec("rwxrwxr-x")
print(decmode)
print(oct(decmode))

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.

Quelltext auswählen
1
2
3
path = os.environ['HOME'] + "/Python/testdatei"
d = open(path, "w")
d.close

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.

Quelltext auswählen
1
2
3
4
5
6
7
d = open(path, "w")
d.write("Hallo Welt!\n")
d.close()

d = open(path, "a")
d.write("Hallo Welt!\n")
d.close()

► Python-Dokumentation: writelines

Mit der Funktion writelines() lassen sich beispielsweise die Elemente einer Liste zeilenweise in eine Datei schreiben:

Quelltext auswählen
1
2
3
4
5
content = ["Hund\n", "Katze\n", "Maus\n"]

d = open(path, "w")
d.writelines(content)
d.close()

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.

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Zunächst werden mehrere Zeilen in eine Datei geschrieben:
d = open(path, "w")
d.write("Europa\nAsien\nAfrika\nAmerika\nAustralien")
d.close

# Jetzt werden die verschiedenen Methoden zum Lesen angewendet:
d = open(path)
content = d.read()
print("Gesamter Inhalt:", content)
d.close

d = open(path)
print("Erste Zeile: ", d.readline().replace("\n", ""))
print("Zweite Zeile:", d.readline().replace("\n", ""))
print("Dritte Zeile:", d.readline().replace("\n", ""))
d.close

d = open(path)
content = d.readlines()
z = 1
for line in content:
    print("Zeile", str(z) + ":", line.replace("\n", ""))
    z += 1
d.close

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.

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
path = os.environ['HOME'] + "/Python/test"
d = open(path, "w")
d.write("Hund  Katze Maus\n")
d.write("Fisch Pferd Wal\n")
d.write("Affe  Biene Schmetterling")
d.close()

d = open(path, "r+")  # Öffnet eine Datei zum Lesen und Schreiben
d.seek(23)  # Setzt den Zeiger an die Position 23
content = d.read(5)  # Liest 5 Zeichen ab der Zeigerposition
print(content)
d.seek(23)
d.write("Ziege")  # Schreibt den String an die Zeigerposition
d.seek(0)
content = d.read()
print(content)
d.close()

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.

Quelltext auswählen
1
2
3
4
5
6
7
8
9
source = os.environ['HOME'] + "/Python/testdatei"
target = os.environ['HOME'] + "/Python/testdatei2"
os.rename(source, target)

target = os.environ['HOME'] + "/Python/temp/testdatei2"
os.rename(source, target)  # Existiert der Zielpfad nicht, so führt dies zu einem OSError.

# Statt dessen kann os.renames verwendet werden:
os.renames(source, target)

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.

Quelltext auswählen
1
2
3
4
5
6
source = os.environ['HOME'] + "/Python/testdatei"
target = os.environ['HOME'] + "/Python/testdatei2"
shutil.copy(source, target)

target = os.environ['HOME'] + "/Python/testdatei3"
shutil.copy2(source, target)

Datei leeren #

Um eine Datei zu leeren, ohne sie zu löschen, kann man sie mit einem leeren Inhalt überschreiben.

Quelltext auswählen
1
2
3
d = open(path, "w")
d.write("")
d.close()

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.

Quelltext auswählen
1
2
filename = os.environ['HOME'] + "/Python/testdatei3"
os.remove(filename)

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.

Quelltext auswählen
1
2
3
4
5
dirname = os.environ['HOME'] + "/Python/temp"
os.mkdir(dirname)

dirname = os.environ['HOME'] + "/Python/temp2/myfolder"
os.makedirs(dirname)

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.

Quelltext auswählen
1
2
3
4
5
dirname = os.environ['HOME'] + "/Python"
objects = os.listdir(dirname)
objects.sort()
for objectname in objects:
    print(objectname)

Möchte man den Ordnerinhalt nur nach bestimmten enthaltenen Objekten (Dateien, Ordner oder Symlinks) auslesen, so kann man sich mit folgender Funktion behelfen:

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def folder_objects(dirname, otype = "all"):
    if (os.path.exists(dirname) == False or
        os.path.isdir(dirname) == False or
        os.access(dirname, os.R_OK) == False):
        return False
    else:
        objects = os.listdir(dirname)
        result = []
        for objectname in objects:
            objectpath = dirname + "/" + objectname
            if (otype == "all" or
                (otype == "dir"  and os.path.isdir(objectpath)  == True) or
                (otype == "file" and os.path.isfile(objectpath) == True) or
                (otype == "link" and os.path.islink(objectpath) == True)):
                result.append(objectname)
        result.sort()
        return result

dirname = os.environ['HOME'] + "/Python"
print("Alle:    ", folder_objects(dirname))
print("Ordner:  ", folder_objects(dirname, "dir"))
print("Dateien: ", folder_objects(dirname, "file"))
print("Symlinks:", folder_objects(dirname, "link"))

Eine alternative Methode zum Auslesen eines Ordners bietet die Funktion glob aus dem gleichnamigen Modul.

Quelltext auswählen
1
2
3
4
5
6
7
import os, glob

dirname = os.environ['HOME'] + "/Python"
objects = glob.glob(dirname + "/*")
objects.sort()
for objectname in objects:
    print(objectname)

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.

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
source = os.environ['HOME'] + "/Python/temp"
target = os.environ['HOME'] + "/Python/temp2"
os.rename(source, target)

source = target
target = os.environ['HOME'] + "/Python/temp3/test"
os.rename(source, target)  # Existiert der Zielpfad nicht, so führt dies zu einem OSError.

# Statt dessen kann os.renames verwendet werden:
os.renames(source, target)

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.

Quelltext auswählen
1
2
3
4
5
6
source = os.environ['HOME'] + "/Python/temp"
target = os.environ['HOME'] + "/Python/temp2"
shutil.copytree(source, target)

# Alternative Methode, bei der die Metadaten der enthaltenen Dateien neu geschrieben werden:
shutil.copytree(source, target, copy_function=shutil.copy)

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.

Quelltext auswählen
1
2
3
4
5
dirname = os.environ['HOME'] + "/Python/temp"
os.rmdir(dirname)

# Alternative Methode, um einen nicht leeren Ordner zu löschen:
shutil.rmtree(dirname)