Глава 15 · Python и файлы

Мини-проект: таблица рекордов

Загрузить → изменить → сохранить — рабочий цикл почти любой персистентной программы.

Соберём файлы, списки, словари, функции (глава 13) и сортировку (глава 11) в одном практическом проекте — таблице рекордов.

rekordy.csv
записи с предыдущих игр
загрузка
список записей
[{"name": "Anna", ...}, ...]
добавление результата
список + новая запись
sort по score
отсортированный список
сохранение
rekordy.csv
обновлённый файл
Загрузить → добавить → отсортировать → сохранить — типичный конвейер персистентных данных.
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"])
★★ Самостоятельная задача
Без повторов имени

Измените load_rekordy/добавление так, чтобы при повторном сохранении результата уже существующего игрока обновлялся его рекорд, а не добавлялась вторая строка с тем же именем.

★★★ Задача повышенной сложности
На JSON вместо CSV

Перепишите тот же проект так, чтобы rekordy.csv стал rekordy.json — сравните, что изменилось в load/save, а что осталось прежним (сортировка, top_n).

Практика: таблица рекордов
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →