Rozdział 15 · Python i akta
Mini-projekt: tabela rekordów
Ładowanie → modyfikacja zapisu → to cykl zadań niemal każdego trwałego programu.
Zebranie plików, list, słowników, funkcji (Rozdział 13) i sortowania (Rozdział 11) w jednym Projekt praktyczny — tabela dokumentacji.
rekordy.csv
nagrania z poprzednich gier
pobierz
↓lista wpisy
[{"name": "Anna", ...}, ...]
dodanie wyniku
↓lista + nowy wpis
sort to score
↓załatwiony lista
zapis
↓rekordy.csv
zaktualizowany plik
tablitsa_rekordov.py
import csv
from pathlib import Path
def load_rekordy(path: Path) -> list[dict]:
if not path.exists():
return []
with path.open("r", encoding="utf-8", newline="") as f:
reader = csv.DictReader(f)
return [{"name": row["name"], "score": int(row["score"])} for row in reader]
def save_rekordy(path: Path, rekordy: list[dict]) -> None:
with path.open("w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["name", "score"])
writer.writeheader()
writer.writerows(rekordy)
def top_n(rekordy: list[dict], n: int) -> list[dict]:
return sorted(rekordy, key=lambda r: r["score"], reverse=True)[:n]
path = Path("rekordy.csv")
rekordy = load_rekordy(path)
rekordy.append({"name": "Carlos", "score": 1500})
save_rekordy(path, rekordy)
for zapis in top_n(rekordy, 3):
print(zapis["name"], zapis["score"])
★★ Zadanie samodzielne
No Name Repeats
Zmień load_rekordy/dodawanie tak, aby przy ponownym zapisaniu wyniku już istniejącego gracza aktualizowany był jego rekord, a nie dodawany drugi wpis o tej samej nazwie.
Challenge
Na JSON zamiast CSV
Przerób ten sam projekt, aby rekordy.csv stał się rekordy.json – porównaj to, co zmieniło się w load/save i co pozostało takie samo (sortowanie, top_n).
Praktyka Tabela wyników
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji