Kapitel 5
Dateien lesen und schreiben
Pfade vom Projektstamm aus
Kapitel 2 hat gezeigt, wie die Shell eine Datei von ihrem Arbeitsverzeichnis aus findet. Python folgt derselben Karte.
Der Editor neben dieser Lektion hat reading_log.py geöffnet. Die ersten Zeilen benennen drei Dateien:
from pathlib import Path
BOOKS_PATH = Path("data") / "books.txt"
REPORT_PATH = Path("reading_report.txt")
HISTORY_PATH = Path("reading_history.txt")
pathlib gehört zu Pythons Standardbibliothek, du musst also nichts installieren. Path gibt einem Dateisystempfad eine eigene Art von Wert. Das / zwischen zwei Pfadteilen verbindet sie; es dividiert nichts.
Ein Pfad ist ein Name, nicht der Inhalt
BOOKS_PATH beschreibt data/books.txt. Diesen Wert zu erstellen öffnet die Datei nicht, prüft nicht ihre Existenz und liest kein einziges Byte daraus. Dieser Unterschied ist nützlich: Dein Programm kann entscheiden, welche Datei es möchte, bevor es eine Dateioperation ausführt.
Das Projekt sieht zurzeit so aus:
reading_log.py
README.txt
data/
books.txt
Die beiden anderen Pfade existieren noch nicht. Spätere Lektionen erstellen sie.
Relativ wozu?
Keiner der drei Pfade beginnt an der Wurzel eines Dateisystems. Es sind projektbezogene relative Pfade: Python interpretiert sie vom Arbeitsverzeichnis des Prozesses aus.
Wenn du python reading_log.py vom Projektstamm aus ausführst, zeigt data/books.txt auf die bereitgestellte Eingabedatei. Wenn du vorher nach data wechselst, würde derselbe Pfad data/data/books.txt bedeuten. Diese Datei gibt es nicht.
Deshalb ist die Gewohnheit aus Kapitel 2, pwd zu verwenden, weiterhin wichtig. Ein Pfadfehler entsteht oft dort, wo das Programm gestartet wurde, nicht in der Zeile, die später zu lesen versucht.
Du könntest einen absoluten Pfad wie /Users/you/Downloads/books.txt ins Programm einfügen. Heute funktioniert er vielleicht auf einem Computer. Sobald das Projekt verschoben wird, jemand anderes es herunterlädt oder Windows die Wurzel anders schreibt, kann er aber scheitern. Die Kursdaten im Projekt zu halten und sie vom Projektstamm aus zu benennen macht den gesamten Ordner portabel.
Was ist unmittelbar nach der Ausführung von BOOKS_PATH = Path("data") / "books.txt" passiert?
Warum sollte data/books.txt relativ zum Projektstamm bleiben?
Die nächste Lektion überschreitet die Grenze zwischen dem Benennen von books.txt und dem Lesen ihres Textes.