Бот всё забывает: сохраняем в файл

Помнишь, в угадайке я честно предупредил: память бота живёт, только пока запущена программа. Перезапустил, и все словари снова пустые. Для игры терпимо, а для нормального бота беда. Назвал боту имя, перезапустил, а он снова «здравствуйте, как вас зовут?». Раздражает.

После урока сможешь: объяснить тему «Бот всё забывает: сохраняем в файл» и выполнить связанный с ней учебный шаг без подсказки.

Сегодня учимся это чинить. Бот будет сохранять данные на диск, в файл, чтобы помнить даже после перезапуска.

Почему память пропадает

Словарь живёт в оперативной памяти. Это как мысли в голове: пока думаешь, они есть, заснул и забыл. Программа закрылась, память очистилась, словарь пропал. Чтобы данные пережили перезапуск, их надо записать на диск. Диск это как тетрадка: что записал, то останется.

Файл JSON

Удобнее всего складывать словари и списки в формат под названием JSON. В Python для него есть готовый модуль json, подключаем сверху: import json. Сохранить словарь в файл это две строчки:

import json

dannye = {"Аня": 5, "Петя": 3}

with open("dannye.json", "w", encoding="utf-8") as f:
    json.dump(dannye, f, ensure_ascii=False)
  • open("dannye.json", "w", ...) открывает файл на запись. Буква w это write, «писать». Нет файла — создастся.
  • with ... as f: аккуратный способ работать с файлом: он сам закроется, когда закончим.
  • json.dump(dannye, f, ensure_ascii=False) записывает словарь в файл. ensure_ascii=False нужен, чтобы русские буквы сохранились буквами, а не кракозябрами.

Читаем обратно

with open("dannye.json", encoding="utf-8") as f:
    snova = json.load(f)

print(snova)

json.load(f) читает файл и превращает обратно в словарь. Теперь snova это тот же словарь, что мы сохраняли. Открой файл dannye.json в редакторе, и увидишь свои данные прямо текстом. Это и есть тетрадка бота.

При самом первом запуске файла ещё нет, читать нечего. Python ругнётся ошибкой FileNotFoundError. Это не поломка: бот просто ещё ничего не записал. Поймаем её и начнём с пустого словаря, как именно — в следующем уроке.

Контрольный вопрос. Какой функцией модуля json записывают словарь в файл? Напиши имя: json.____(dannye, f).

Подсказка: В модуле json четыре парные функции: две пишут, две читают. Из пары для записи выбирай ту, что работает с файлом, а не со строкой (у «строковой» на конце s).

Онлайн-проверка ответа появится позже

Задание. Сделай словарь с парой записей, сохрани его в файл через json.dump, прочитай обратно через json.load и напечатай. Открой получившийся .json файл в редакторе и посмотри, как лежат данные.

Подсказка: Запись: open(…, «w») + json.dump. Чтение: open(…) + json.load. Не забудь encoding=»utf-8″ и ensure_ascii=False при записи.

✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.

Онлайн-проверка ответа появится позже

Зачёт, если:
✅ словарь сохраняется в .json через json.dump и читается обратно через json.load тем же словарём;
✅ файл .json открыт в редакторе, данные видны текстом.

Практикум: найди файл на диске

Файл .json — обычный текст, его можно открыть любым текстовым редактором: Блокнотом на Windows, TextEdit на macOS (он там есть сразу) или в VS Code.

Задание. Запусти свою программу с json.dump, найди созданный файл .json в папке проекта и открой его в Блокноте (macOS — TextEdit, можно в VS Code). Пришли скриншот, где видны имя файла и его содержимое. В поле ответа напиши имя файла.

Подсказка: Файл появляется в той папке, откуда запускалась программа. Не видно — проверь имя в строке open(…).

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Онлайн-проверка ответа появится позже

Практикум. Зачёт, если:
✅ файл создан программой;
✅ открыт в редакторе;
✅ внутри твои данные.

← Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева