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
Load → add → sort → save to typowy trwały pipeline danych.
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
Otwórz praktykę →