Глава 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, без установки