РАЗБИРАЕМ ПО ШАГАМ
От идеи к работающему коду
Чтобы данные пережили закрытие программы, их нужно записать. Разберём текстовый файл и JSON: как сохранить список записей, прочитать его обратно и проверить сохранённую структуру.
Сразу к запуску примера ↓
- 1Данные Python
- 2Запись JSON
- 3Чтение и восстановление
1. Запись заменяет содержимое
Режим w и Path.write_text записывают новый текст, заменяя прежний файл целиком. Режим a дописывает текст в конец. Выбирай режим осознанно, чтобы не потерять записи.
В браузерном примере используем только учебные файлы. Постоянное хранение проекта между запусками проверяй локально: виртуальные файлы сайта не заменяют папку проекта на компьютере.
from pathlib import Pathpath = Path("note.txt")path.write_text("Первая запись\n", encoding="utf-8")with path.open("a", encoding="utf-8") as file: file.write("Вторая запись\n")print(path.read_text(encoding="utf-8"))2. JSON — текстовый формат обмена
JSON хранит объекты, массивы, строки, числа, логические значения и null. В Python им обычно соответствуют dict, list, str, числа, bool и None. JSON не является исполняемым Python-кодом.
json.dumps превращает данные в строку JSON, json.loads читает её обратно. ensure_ascii=False оставляет русские буквы читаемыми, indent=2 добавляет отступы. В JSON ключи объектов — строки.
import jsonnotes = [{"text": "Повторить функции", "done": False}]text = json.dumps(notes, ensure_ascii=False, indent=2)print(text)loaded = json.loads(text)print(loaded[0]["text"])3. Сохранение и загрузка файла
Разделяем две операции: сериализовать данные в JSON и записать строку в UTF-8. При загрузке сначала читаем текст, затем восстанавливаем данные.
Проверка loaded == notes подтверждает совпадение содержания после полного пути. Простая допись одного JSON в конец другого не создаёт корректный общий документ: список нужно загрузить, изменить и сохранить целиком.
import jsonfrom pathlib import Pathnotes = [{"text": "Собрать проект", "done": False}]path = Path("notes.json")path.write_text(json.dumps(notes, ensure_ascii=False, indent=2), encoding="utf-8")loaded = json.loads(path.read_text(encoding="utf-8"))print(loaded == notes)4. Дата, имя файла и схема записи
datetime.now получает локальное время. isoformat подходит для значения внутри JSON. Для имени файла лучше strftime без двоеточий: они недопустимы в именах на некоторых системах.
У записи заранее определяем поля и типы: text — строка, created — строка с датой, done — bool. После чтения нельзя считать любой JSON правильным блокнотом: проверку структуры добавим следующим шагом.
from datetime import datetimenow = datetime.now()record = {"text": "Мой проект", "created": now.isoformat(timespec="seconds"), "done": False}filename = now.strftime("note-%Y%m%d-%H%M%S.txt")print(record)print(filename)Где легко ошибиться
- Случайно стереть файл режимом w.
- Использовать eval для чтения JSON вместо json.loads.
- Считать успешный разбор JSON проверкой нужных полей.
Проверь понимание: Чем отличаются json.dumps и json.loads?
dumps превращает данные Python в JSON-строку, loads восстанавливает данные из JSON-строки.
