Python — Pfade und expanduser

In diesem Blogbeitrag wird gezeigt, wie mit Python unter Verwendung von expanduser ein Pfad zu einem bestimmten Verzeichnis erzeugt werden kann. Dieser Artikel knüpft dabei an das Tutorial an, bei dem es um das Lesen und Schreiben von Textdateien ging. Beginnen wir also mit dem Code aus jenem Artikel, genauer gesagt mit dem Code zum Lesen einer Datei, die den Namen „MyText.txt“ hat:

with open("MyText.txt") as file:
    text = file.read()
    print(text)

Ein Pfad ist in diesem Beispiel nicht angegeben. Vielmehr muss sich die mit with open() zu öffnende Textdatei in jenem Verzeichnis befinden, in dem auch das Python-Skript gespeichert ist. Was muss man also machen, wenn eine Datei geöffnet werden soll (sei es zum Lesen oder zum Schreiben), die sich in einem anderen Verzeichnis befindet? Wie kann überprüft werden, ob ein bestimmtes Verzeichnis existiert?

Pfad als Argument übergeben

Anstatt den Namen der Textdatei zu übergeben, kann an die Funktion open() der Pfad übergeben werden. Im folgenden Beispiel wird er zuvor aus dem Pfad zum Verzeichnis und dem Dateinamen erstellt. Diese Angaben werden den Variablen bzw. Konstanten DIRECTORY und FILENAME zugewiesen und mit der Methode join() verknüpft. Die Verwendung einer Ausnahmebehandlung stellt sicher, dass der Pfad auch existiert.

DIRECTORY = "/Users/bodo/Documents"
FILENAME = "MyText.txt"

def main() -> None:
    path_to_file = "/".join([DIRECTORY, FILENAME])

    try:
        with open(path_to_file) as file:
            text = file.read()
            print(text)
    except FileNotFoundError as ex:
        print(ex)

if __name__ == "__main__":
    main()

An dieser Stelle stoßen wir auf ein weiteres Problem. Sofern das aufzurufende Verzeichnis sich in der Verzeichnishierarchie unterhalb des eigenen Benutzerverzeichnisses befindet, stellt sich die Frage, wie dieses ermittelt werden kann. Zwar könnte man im Code (so wie im Beispiel) den Pfad unter Verwendung des Benutzernamens eingeben, dies würde aber dazu führen, dass das Programm lediglich auf dem eigenen Rechner funktioniert.

expanduser verwenden

Hier stehen verschiedene Lösungswege zur Verfügung. In diesem Tutorial greife ich auf expanduser() zurück, das zum Modul os.path gehört. Zunächst ist folgender Import hinzuzufügen:

from os.path import expanduser

Und jetzt kann der Konstanten DIRECTORY folgendes zugewiesen werden:

DIRECTORY = expanduser("~") + "/Documents"

Ansonsten ändert sich gar nichts, so dass der Code nun folgendermaßen aussieht:

from os.path import expanduser

DIRECTORY = expanduser("~") + "/Documents"
FILENAME = "MyText.txt"

def main() -> None:
    path_to_file = "/".join([DIRECTORY, FILENAME])

    try:
        with open(path_to_file) as file:
            text = file.read()
            print(text)
    except FileNotFoundError as ex:
        print(ex)

if __name__ == "__main__":
    main()

Dieser Code funktioniert — unabhängig vom Benutzernamen — unter Windows, Linux und macOS.