Помнишь, в угадайке я честно предупредил: память бота живёт, только пока запущена программа. Перезапустил, и все словари снова пустые. Для игры терпимо, а для нормального бота беда. Назвал боту имя, перезапустил, а он снова «здравствуйте, как вас зовут?». Раздражает.
После урока сможешь: объяснить тему «Бот всё забывает: сохраняем в файл» и выполнить связанный с ней учебный шаг без подсказки.
Сегодня учимся это чинить. Бот будет сохранять данные на диск, в файл, чтобы помнить даже после перезапуска.
Почему память пропадает
Словарь живёт в оперативной памяти. Это как мысли в голове: пока думаешь, они есть, заснул и забыл. Программа закрылась, память очистилась, словарь пропал. Чтобы данные пережили перезапуск, их надо записать на диск. Диск это как тетрадка: что записал, то останется.
Файл 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(…).
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
Онлайн-проверка ответа появится позже
Практикум. Зачёт, если:
✅ файл создан программой;
✅ открыт в редакторе;
✅ внутри твои данные.
