Files (Dateien, programmiertechnisch)
Kurz: Aus Programmsicht ein Objekt, über das ein Programm mit einer Datei im Dateisystem interagiert — erstellen, lesen, schreiben oder löschen.
Genauer: Der Zugriff auf Dateien läuft über I/O-Streams — Datenströme, über die byte- oder zeichenweise gelesen bzw. geschrieben wird. Weil Datei-Operationen von externen Faktoren abhängen (Datei existiert nicht, keine Berechtigung, Datenträger voll), lösen sie häufig Exceptions aus und sollten entsprechend behandelt bzw. mit try-with-resources sauber wieder geschlossen werden.
Im Detail
Der wichtigste Unterschied zu Variablen im Arbeitsspeicher: Eine Datei liegt auf einem physischen Datenträger und “gehört” nicht exklusiv dem eigenen Programm — andere Prozesse können sie gleichzeitig lesen, ändern, verschieben oder löschen, das Betriebssystem kann Berechtigungen verweigern, und der Datenträger kann voll oder nicht erreichbar sein (z. B. bei Netzlaufwerken). Deshalb ist praktisch jede Dateioperation eine potenzielle Fehlerquelle, die im Code behandelt werden muss — anders als z. B. das Setzen einer lokalen Variable, das fast nie fehlschlagen kann.
Ein typischer, robuster Ablauf zum Umgang mit einer Datei:
try:
with open("konfiguration.txt", "r") as datei:
inhalt = datei.read()
verarbeite(inhalt)
except FileNotFoundError:
print("Datei existiert nicht.")
except PermissionError:
print("Keine Leseberechtigung.")
# "with" schließt die Datei automatisch, auch bei einer Exception
# - dasselbe Prinzip wie try-with-resourcesDateien werden fast nie “auf einen Schlag” komplett gelesen oder geschrieben (das wäre bei großen Dateien speicherhungrig), sondern über I/O-Streams — einen kontinuierlichen Datenfluss, den man schrittweise (byte- oder zeichenweise, oder in Blöcken) liest oder schreibt. Das Betriebssystem verwaltet dafür intern einen “Datei-Zeiger” (Cursor), der sich merkt, an welcher Stelle in der Datei der nächste Lese-/Schreibzugriff stattfindet.
Ein zentraler Grundsatz beim Umgang mit Dateien: jede geöffnete Datei muss wieder geschlossen werden. Solange eine Datei offen ist, hält das Betriebssystem dafür eine begrenzte Ressource (einen “File Handle”) — wird das Schließen vergessen, laufen diese Ressourcen irgendwann aus, und gepufferte Schreibdaten, die noch nicht physisch gespeichert wurden, können sogar komplett verloren gehen. try-with-resources (bzw. das with-Statement in Python) automatisiert dieses Schließen zuverlässig, auch wenn während der Verarbeitung eine Exception auftritt.
Siehe auch: I/O Streams, try-with-resources, Read Files, Write Files