Aufwärmen · Aufgabe 1 von 7
Aufwärmen aus der letzten Lektion: Was gibt das aus?
print(f"{'pen':<5}|{3:>3}|")// B5.3 · ca. 25 Min. · Einstieg
Nach dieser Lektion speichern Sie Text in einer Datei und lesen ihn wieder ein: mit dem passenden Modus, der Datei in einem with-Block und dem Zeilenumbruch am Ende jeder Zeile im Griff.
Danach können Sie
Aufwärmen · Aufgabe 1 von 7
print(f"{'pen':<5}|{3:>3}|")Vorhersagen · Aufgabe 2 von 7
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("one")
f.write("two")
with open("notes.txt", encoding="utf-8") as f:
print(f.read())Üben · Aufgabe 3 von 7
for word in ["red", "green"]:
with open("log.txt", "____", encoding="utf-8") as f:
f.write(word + "\n")Üben · Aufgabe 4 von 7
for word in ["red", "green"]:
with open("log.txt", "w", encoding="utf-8") as f:
f.write(word + "\n")
with open("log.txt", encoding="utf-8") as f:
print(f.read().split())Üben · Aufgabe 5 von 7
Denksport · Aufgabe 6 von 7
with open("names.txt", "w", encoding="utf-8") as f:
f.write("Ada\nGrace\n")
with open("names.txt", encoding="utf-8") as f:
lengths = [len(line) for line in f]
print(lengths)Anwenden · Aufgabe 7 von 7
Prüfen Sie Ihr Ergebnis anhand dieser Liste
Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.
Ausgearbeitetes Beispiel
Das Programm schreibt eine Einkaufsliste mit "w", ergänzt einen Eintrag mit "a" und liest die Datei zweimal: einmal Zeile für Zeile, um die Einträge zu nummerieren, und einmal mit read(), um den rohen Text anzusehen. repr zeigt die Zeilenumbrüche, die write in die Datei geschrieben hat.
main.py
items = ["apples", "bread", "cheese"]
with open("shopping.txt", "w", encoding="utf-8") as f:
for item in items:
f.write(item + "\n")
with open("shopping.txt", "a", encoding="utf-8") as f:
written = f.write("dates\n")
print("appended", written, "characters")
with open("shopping.txt", encoding="utf-8") as f:
for number, line in enumerate(f, start=1):
print(f"{number}. {line.strip()}")
with open("shopping.txt", encoding="utf-8") as f:
text = f.read()
print(repr(text[:13]), len(text.splitlines()), "lines")
Ausführen mit
python main.pyAusgabe
appended 6 characters
1. apples
2. bread
3. cheese
4. dates
'apples\nbread\n' 4 linesTab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.
Übung 1 von 2
scores.txt (zweiter Reiter) enthält pro Zeile ein Paar name,score. Lesen Sie die Datei und geben Sie zwei Zeilen aus: wie viele Punktzahlen es gibt und ihren Durchschnitt mit einer Nachkommastelle, dann den besten Namen samt Punktzahl. Für die mitgelieferte Datei: 3 scores, average 82.3 und best: ada (90). Die Tests probieren auch andere Dateien, übernehmen Sie also keine festen Zahlen.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.
with open("scores.txt", encoding="utf-8") as f: und dann for line in f: liefert eine Zeile nach der anderen.
line.strip().split(",") macht aus "ada,90\n" die Liste ["ada", "90"]. Wandeln Sie die Punktzahl mit int() um.
Sammeln Sie die Paare in einem Dictionary. max nimmt ein key= wie sorted() in Lektion B3.4, also liefert max(scores, key=lambda name: scores[name]) den Namen mit der höchsten Punktzahl, und {average:.1f} rundet auf eine Nachkommastelle.
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
scores: dict[str, int] = {}
with open("scores.txt", encoding="utf-8") as f:
for line in f:
name, score = line.strip().split(",")
scores[name] = int(score)
average = sum(scores.values()) / len(scores)
best = max(scores, key=lambda name: scores[name])
print(f"{len(scores)} scores, average {average:.1f}")
print(f"best: {best} ({scores[best]})")
Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.py
# Read scores.txt: one "name,score" pair per line.
print("3 scores, average 82.3")
print("best: ada (90)")
test_main.py
from learnrun import run_main
def run_with(text):
with open("scores.txt", encoding="utf-8") as f:
original = f.read()
with open("scores.txt", "w", encoding="utf-8") as f:
f.write(text)
try:
return run_main().strip().splitlines()
finally:
with open("scores.txt", "w", encoding="utf-8") as f:
f.write(original)
def test_given_file():
"""Die mitgelieferte Datei ergibt 3 Punktzahlen, Durchschnitt 82.3, beste ada"""
got = run_main().strip().splitlines()
assert got == ["3 scores, average 82.3", "best: ada (90)"], f"das Programm gab {got!r} aus"
def test_other_file():
"""Eine andere Datei ergibt ihre eigene Anzahl, ihren Durchschnitt und ihre Beste"""
got = run_with("lin,70\nmo,95\n")
assert got == ["2 scores, average 82.5", "best: mo (95)"], f"für lin,70 und mo,95 gab das Programm {got!r} aus"
def test_no_final_newline():
"""Eine Datei ohne Zeilenumbruch in der letzten Zeile funktioniert auch"""
got = run_with("kim,60\nsam,61")
assert got == ["2 scores, average 60.5", "best: sam (61)"], f"für kim,60 und sam,61 gab das Programm {got!r} aus"
scores.txt
ada,90
grace,85
alan,72
Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.
Programm ausführen:
python main.pyPrüfungen ausführen (learnrun.py muss im selben Ordner liegen):
python learnrun.py testlearnrun.py herunterladenÜbung 2 von 2
Schreiben Sie save_lines(path, lines), das jeden String der Liste in eine eigene Zeile der Datei schreibt und den alten Inhalt ersetzt, und load_lines(path), das die Zeilen als Liste ohne Zeilenumbrüche zurückgibt. save_lines("todo.txt", ["milk", "eggs"]) macht den Dateitext genau zu "milk\neggs\n". Nutzen Sie in beiden with und encoding="utf-8".
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.
Der Modus "w" leert die Datei zuerst, ein zweites Speichern ersetzt also das erste. "a" würde anhängen.
write ergänzt keinen Zeilenumbruch: Schreiben Sie line + "\n" für jeden Eintrag.
Entfernen Sie beim Lesen den Umbruch aus jeder Zeile: [line.rstrip("\n") for line in f]. strip() geht auch, entfernt aber auch Leerzeichen an den Enden.
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
def save_lines(path: str, lines: list[str]) -> None:
with open(path, "w", encoding="utf-8") as f:
for line in lines:
f.write(line + "\n")
def load_lines(path: str) -> list[str]:
with open(path, encoding="utf-8") as f:
return [line.rstrip("\n") for line in f]
if __name__ == "__main__":
save_lines("todo.txt", ["milk", "eggs"])
print(load_lines("todo.txt"))
Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.py
def save_lines(path: str, lines: list[str]) -> None:
with open(path, "a", encoding="utf-8") as f:
for line in lines:
f.write(line)
def load_lines(path: str) -> list[str]:
with open(path, encoding="utf-8") as f:
return list(f)
if __name__ == "__main__":
save_lines("todo.txt", ["milk", "eggs"])
print(load_lines("todo.txt"))
test_main.py
from main import load_lines, save_lines
def test_file_text():
"""save_lines schreibt eine Zeile pro Eintrag, jede mit Zeilenumbruch am Ende"""
save_lines("t1.txt", ["milk", "eggs"])
with open("t1.txt", encoding="utf-8") as f:
text = f.read()
assert text == "milk\neggs\n", f"die Datei enthält {text!r}, erwartet war 'milk\\neggs\\n'"
def test_round_trip():
"""load_lines liefert genau das Gespeicherte zurück, auch Umlaute"""
lines = ["Grüße", "tea for two", "42"]
save_lines("t2.txt", lines)
got = load_lines("t2.txt")
assert got == lines, f"load_lines gab {got!r} zurück, erwartet war {lines!r}"
def test_replaces():
"""Erneutes Speichern ersetzt die alten Zeilen"""
save_lines("t3.txt", ["old"])
save_lines("t3.txt", ["new"])
got = load_lines("t3.txt")
assert got == ["new"], f"nach dem Speichern von ['old'] und dann ['new'] gab load_lines {got!r} zurück"
Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.
Programm ausführen:
python main.pyPrüfungen ausführen (learnrun.py muss im selben Ordner liegen):
python learnrun.py testlearnrun.py herunterladenwith open("scores.txt", encoding="utf-8") as f:
print(f.read())
Was Python ausgibt
No such file or directory: 'scores.txt'Warum, und die Lösung
Die ganze Zeile lautet FileNotFoundError: [Errno 2] No such file or directory: 'scores.txt' (im Browser steht 44 statt 2). Der Modus "r" legt nie eine Datei an. Prüfen Sie die Schreibweise und ob die Datei in dem Ordner liegt, in dem das Programm läuft; auf Ihrem Rechner ist das der Ordner, aus dem Sie python gestartet haben.
count = 42
with open("count.txt", "w", encoding="utf-8") as f:
f.write(count)
Was Python ausgibt
TypeError: write() argument must be str, not intWarum, und die Lösung
write nimmt nur Strings, anders als print. Wandeln Sie zuerst um und setzen Sie den Zeilenumbruch selbst: f.write(str(count) + "\n") oder f.write(f"{count}\n"). Beim Zurücklesen macht int(line) aus dem Text wieder eine Zahl.
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("first line\n")
with open("notes.txt", encoding="utf-8") as f:
f.write("second line\n")
Was Python ausgibt
io.UnsupportedOperation: not writableWarum, und die Lösung
Ohne Modus nimmt open "r", und das liest nur. Um eine Zeile anzuhängen, öffnen Sie mit "a"; um den Inhalt zu ersetzen, mit "w".
Python im Browser: Pyodide 314.0.7, MPL-2.0. Lizenz und Quellcode
5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.
Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.