Kodokon kodokon.com

Dateien und Module: with, import, Organisation

Lies und schreibe Dateien sauber mit with, tausche JSON aus und organisiere deinen Code in importierbare Module.

10 Min. · 3 Fragen

Diese Lektion in Kodokon öffnen

Dateien zu lesen und zu schreiben ist das tägliche Brot eines echten Programms: Exporte, Logs, Konfigurationen. Das Schlüsselwort with öffnet die Datei und garantiert, dass sie geschlossen wird, selbst wenn mitten im Block ein Fehler auftritt. Es ist der einzige professionelle Weg, eine Datei zu öffnen: Ohne es kann ein vergessenes close() Daten beschädigen oder Systemressourcen erschöpfen.

PYTHON
lines = ["alpha", "beta", "gamma"]

with open("notes.txt", "w", encoding="utf-8") as f:
    for line in lines:
        f.write(line + "\n")

with open("notes.txt", encoding="utf-8") as f:
    content = f.read()

print(content)
Der Modus 'w' schreibt, indem er den Inhalt überschreibt; ohne Modus liest man.

Für strukturierte Daten erfinde nicht dein eigenes Format: Das Modul json aus der Standardbibliothek wandelt Dictionaries und Listen in Text um, und wieder zurück. Es ist das universelle Austauschformat zwischen Programmen, APIs und Konfigurationsdateien.

PYTHON
import json

config = {"debug": True, "retries": 3}

with open("config.json", "w", encoding="utf-8") as f:
    json.dump(config, f, indent=2)

with open("config.json", encoding="utf-8") as f:
    loaded = json.load(f)

print(loaded["retries"])  # 3
json.dump schreibt die Struktur, json.load baut sie wieder auf.

Ein Modul ist einfach eine .py-Datei: import billing lädt billing.py und führt ihren Inhalt nur einmal aus. Organisiere deinen Code nach Verantwortlichkeit - ein Modul für die Abrechnung, ein anderes für die Speicherung - und halte die import-Anweisungen am Anfang der Datei. Der Test if __name__ == "__main__" unterscheidet zwei Situationen: Direkt ausgeführt, führt die Datei diesen Block aus; importiert, ignoriert sie ihn.

PYTHON
def compute_total(prices):
    return round(sum(prices), 2)

def main():
    print(compute_total([9.99, 4.5, 20.0]))

if __name__ == "__main__":
    main()
Inhalt von billing.py: überall importierbar, direkt ausführbar.
BASH
python billing.py
So ausgeführt, führt die Datei main() aus; importiert, tut sie nichts.

Wissenscheck

Stelle sicher, dass du die wichtigsten Punkte dieser Lektion behalten hast.

  1. Was ist der Hauptvorteil von with open(...) gegenüber open() allein?
    • Die Datei wird automatisch geschlossen, selbst im Fehlerfall
    • Das Lesen der Datei ist schneller
    • Die Datei wird erstellt, wenn sie nicht existiert, egal in welchem Modus
  2. Was ist der Unterschied zwischen den Modi "w" und "a"?
    • "w" überschreibt vorhandenen Inhalt, "a" hängt ans Ende an
    • "w" schreibt Text, "a" schreibt binär
    • "w" erstellt die Datei, "a" schlägt fehl, wenn sie nicht existiert
  3. Wofür ist der Test if __name__ == "__main__" da?
    • Um zu prüfen, ob die Datei tatsächlich main.py heißt
    • Um einen Block nur dann auszuführen, wenn die Datei direkt gestartet wird
    • Um zu verhindern, dass das Modul von anderen Dateien importiert wird