HOWTO · Python

Dateien in einem anderen Verzeichnis in Python öffnen

Erfahren Sie, wie Sie eine Datei außerhalb des aktuellen Arbeitsverzeichnisses mit einem absoluten Pfad, pathlib oder einem relativen Pfad öffnen und wie Python Pfade auflöst.

Auf dieser Seite

Übergeben Sie den Dateipfad an Pythons Funktion open(). Ein absoluter Pfad bezeichnet eine Datei ausgehend vom Stammverzeichnis des Dateisystems. Ein relativer Pfad beginnt dagegen im aktuellen Arbeitsverzeichnis des Prozesses (CWD). Dieses Verzeichnis kann vom Ordner abweichen, in dem Ihr Skript liegt. Für Projektdateien können Sie mit pathlib.Path auf einfache Weise plattformübergreifend Pfade zusammensetzen.

Dateipfade und das aktuelle Arbeitsverzeichnis verstehen

Das CWD ist das Verzeichnis, das Python zum Auflösen relativer Pfade verwendet. Oft ist es das Verzeichnis, aus dem Sie das Programm gestartet haben, und nicht der Ordner des Skripts. Wenn ein Pfad nicht auf den erwarteten Ort verweist, können Sie das CWD prüfen:

import os

print(os.getcwd())

Ein absoluter Pfad bezeichnet einen Ort unabhängig vom CWD. Ein relativer Pfad wie data/notes.txt wird unterhalb des CWD interpretiert. Kann open() den so ermittelten Ort nicht finden, löst Python FileNotFoundError aus. Prüfen Sie deshalb zuerst den Pfad und das CWD, bevor Sie Ihren Code ändern.

Eine Datei mit einem absoluten Pfad öffnen

Verwenden Sie den vollständigen Pfad, wenn Ihnen der Speicherort der Datei bekannt ist. Dieses Beispiel erstellt eine Datei an einem absoluten temporären Pfad, liest sie und gibt ihren Inhalt aus:

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as directory:
    file_path = Path(directory) / "notes.txt"
    file_path.write_text("Meeting at 10", encoding="utf-8")
    with open(file_path, "r", encoding="utf-8") as file:
        print(file.read())

Das temporäre Verzeichnis macht das Beispiel unabhängig von Dateien, die bereits auf Ihrem Rechner liegen. Ersetzen Sie es in Ihrem Programm durch den tatsächlichen Speicherort der Datei. Der Modus "r" liest Text; mit encoding="utf-8" legen Sie die Textkodierung ausdrücklich fest. Die with-Anweisung schließt die Datei, sobald der Block endet, auch wenn darin ein Fehler auftritt.

Unter Windows können Sie einen Pfad mit Schrägstrichen, als Raw-String wie r"C:\Users\Ada\notes.txt" oder mit maskierten Backslashes wie "C:\\Users\\Ada\\notes.txt" schreiben. Ein Backslash beginnt nur dann eine Escape-Sequenz, wenn darauf eine bekannte Sequenz folgt; \n steht beispielsweise für einen Zeilenumbruch. Ein Raw-String-Literal darf nicht mit einem einzelnen Backslash enden. Wenn Sie Pfade aus einzelnen Bestandteilen mit pathlib zusammensetzen, müssen Sie sich um viele dieser Details der String-Schreibweise nicht kümmern.

Pfade mit pathlib zusammensetzen

pathlib.Path ist eine Klasse zur Darstellung und Verknüpfung von Dateisystempfaden. Der Operator / verbindet Bestandteile entsprechend den Konventionen des jeweiligen Betriebssystems. Das folgende Beispiel erstellt eine Datei in einem benachbarten Verzeichnis und öffnet sie über ihren absoluten Pfad:

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as parent:
    root = Path(parent)
    current = root / "app"
    other = root / "shared"
    current.mkdir()
    other.mkdir()
    target = other / "notes.txt"
    target.write_text("Shared notes", encoding="utf-8")

    file_path = target.resolve()
    with open(file_path, "r", encoding="utf-8") as file:
        print(file.read())

Beginnen Sie in einem echten Projekt mit einem bekannten Verzeichnis und ergänzen Sie die Unterordner, zum Beispiel mit Path("/srv/project") / "data" / "notes.txt". Verwenden Sie ein absolutes Ausgangsverzeichnis, wenn das Programm unabhängig davon funktionieren soll, von wo aus es gestartet wurde. Path.resolve() liefert für ein vorhandenes Ziel einen absoluten Pfad und kann die Fehlersuche bei Pfaden erleichtern.

Einen relativen Pfad verwenden oder das Arbeitsverzeichnis ändern

Angenommen, das Projekt enthält scripts/read_notes.py und shared/notes.txt, und das CWD ist project/scripts. Von diesem CWD aus führt ../shared/notes.txt zunächst eine Ebene hinauf nach project und dann in shared. Das ist praktisch, wenn das Startverzeichnis feststeht. Derselbe relative Pfad kann jedoch auf einen anderen Ort verweisen, wenn das Programm mit einem anderen CWD gestartet wird. Um einen Projektpfad stattdessen am Skript auszurichten, können Sie ihn aus Path(__file__).resolve().parent zusammensetzen.

Dieses ausführbare Beispiel erstellt die Projektstruktur, setzt das Prozess-CWD auf project/scripts und liest die Datei im Nachbarverzeichnis mit einer with-Anweisung:

import os
from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as directory:
    project = Path(directory) / "project"
    scripts = project / "scripts"
    shared = project / "shared"
    scripts.mkdir(parents=True)
    shared.mkdir()
    (shared / "notes.txt").write_text("Project notes", encoding="utf-8")

    original_directory = os.getcwd()
    try:
        os.chdir(scripts)
        with open("../shared/notes.txt", "r", encoding="utf-8") as file:
            print(file.read())
    finally:
        os.chdir(original_directory)

Der relative Pfad wird ausgehend vom Prozess-CWD aufgelöst. Dieses Beispiel setzt es auf project/scripts; der Pfad wird nicht ausgehend vom Verzeichnis der Quelldatei aufgelöst.

Wenn ein Programm mehrere Dateien in einem Verzeichnis verarbeitet, kann es das Prozess-CWD ändern und anschließend kurze relative Pfade verwenden. Dieses Beispiel erstellt die Eingabedatei vor dem Verzeichniswechsel und stellt danach das ursprüngliche CWD wieder her:

import os
from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as directory:
    target = Path(directory) / "notes.txt"
    target.write_text("Daily notes", encoding="utf-8")
    original_directory = os.getcwd()
    try:
        os.chdir(directory)
        with open("notes.txt", "r", encoding="utf-8") as file:
            print(file.read())
    finally:
        os.chdir(original_directory)

os.chdir() ändert den Zustand des gesamten Prozesses und damit auch, wie relative Pfade in anderen Programmteilen aufgelöst werden. Wenn Sie das vorherige Verzeichnis wiederherstellen, begrenzen Sie diese Auswirkung. Für eine einzelne Datei ist es meist einfacher, einen absoluten Pfad oder einen pathlib-Pfad zu übergeben. Falls der Zugriff weiterhin fehlschlägt, prüfen Sie neben dem Speicherort auch, ob der Prozess die Datei lesen darf.