Код БарсикОсновы Python
Основы Python›C20 · Теория

Теория · C20

Запись файлов и JSON

Разберись в теме, запусти пример и переходи к самостоятельным задачам.

РАЗБИРАЕМ ПО ШАГАМ

От идеи к работающему коду

Чтобы данные пережили закрытие программы, их нужно записать. Разберём текстовый файл и JSON: как сохранить список записей, прочитать его обратно и проверить сохранённую структуру.

Сразу к запуску примера ↓
Барсик сохраняет набор записей в файл и восстанавливает его.
Барсик сохраняет набор записей в файл и восстанавливает его.
  1. 1Данные Python
  2. 2Запись JSON
  3. 3Чтение и восстановление

1. Запись заменяет содержимое

Режим w и Path.write_text записывают новый текст, заменяя прежний файл целиком. Режим a дописывает текст в конец. Выбирай режим осознанно, чтобы не потерять записи.

В браузерном примере используем только учебные файлы. Постоянное хранение проекта между запусками проверяй локально: виртуальные файлы сайта не заменяют папку проекта на компьютере.

Python
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 ключи объектов — строки.

Python
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 в конец другого не создаёт корректный общий документ: список нужно загрузить, изменить и сохранить целиком.

Python
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 правильным блокнотом: проверку структуры добавим следующим шагом.

Python
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-строки.

Сохраняем данные в JSON

Запусти пример. Затем измени код или входные данные и проверь, как меняется вывод.

Пример входных данных

Ввод не нужен

Ожидаемый вывод

{"name": "Барсик", "score": 12}
12
main.pyPython · можно менять код

Подготавливаем редактор…

Загрузка Python…

Каждый ответ — с новой строки.

Твой вывод

Здесь появится результат запуска.

Дальше — самостоятельные задачи

  1. Сохранить и загрузить список записей
  2. Записать рожицу в файл с допустимым именем и временем
  3. Вынести справочник элементов из кода в JSON