Лекция 10

Форматы
данных

Как сохранить, передать
и правильно прочитать

125

Обмен · хранение · конфигурация

01 / 23

Один заказ — несколько задач

Те же данные понадобятся разным получателям.

В ПАМЯТИ ПРОГРАММЫ Заказ №125 Анна · книга × 2 Мобильное приложениеполучить ответ API Бухгалтерияпрочитать выгрузку Следующий запусквосстановить данные

Как записать заказ, чтобы его правильно прочитали?

02 / 23

Как упаковать данные для передачи?

Собранный шкаф, его панели в коробке и шкаф после сборки: метафора сериализации и десериализации
Объект в программеСериализация
представление для передачи
Десериализация
данные у получателя

Получателю нужны данные и правила чтения.

03 / 23

Четыре договорённости

HTTP · протокол

Как отправить запрос
и получить ответ?

JSON · формат

Как записать поля,
значения и вложенность?

UTF-8 · кодировка

Как представить символы
текста байтами?

Схема

Какие поля, типы
и ограничения допустимы?

Файл открылся. Значит ли это, что данные поняты правильно?

04 / 23

Мы придумали свой формат

Номер — 5 знаков. Имя — 20. Масса — 5.

00125Анна 01500
номер заказаполучательмасса, г

Учебная запись фиксированной длины. Позиции считаем в знаках.

Без описания полей последовательность трудно прочитать.

05 / 23

А теперь добавим телефон

Старая программа продолжает читать по прежним позициям.

Первая версия

номер → имя → масса

Читатель знает порядок
и длину полей.

Новое требование

номер → имя → телефон → масса

Что он прочитает
вместо массы?

Изменение записи требует договориться
о совместимости старого и нового читателя.

06 / 23

Файл переживает свою программу

DBF

Описание структуры внутри файла.
Какие колонки записаны и как их читать?

ZIP64

Расширение существующего формата.
Как поддержать объёмы, которых раньше не ожидали?

Версии

Несколько правил чтения.
Какие старые данные продолжит понимать новая программа?

Формат становится обязательством перед его пользователями.

07 / 23

Что внутри DOCX?

Заказ №125

Получатель: Анна
Товар: книга, 2 шт.

Изображение посылки внутри учебного документа

Документ: текст + изображение

example.docx
├── [Content_Types].xml
├── _rels/
└── word/
    ├── document.xml
    └── media/
        └── parcel.png

Скачать учебный DOCX · Открыть как ZIP

Контейнер объединяет файлы. Форматы внутри описывают содержимое.

08 / 23

Буквы тоже становятся байтами

Привет

6 букв · 12 байтов в UTF-8

len("Привет")                 # 6
len("Привет".encode("utf-8"))  # 12

Те же байты, другое чтение

Привет

UTF-8 ошибочно прочитан
как Windows-1251.

Файл мог сохраниться без повреждений.

При записи и чтении кодировка должна быть согласована.

09 / 23

Бухгалтерии нужна таблица

Договоримся о колонках, разделителе и правилах чтения.

order_id;city;postal_code;amount_rub
125;Москва;001250;1500
126;Чебоксары;428000;2200

CSV — текстовая таблица.

TSV — разделитель табуляция.

Учебная выгрузка orders.csv

Какие сведения нужно передать вместе с файлом?

10 / 23

Куда исчезли нули?

Почтовый индекс состоит из цифр. Нужно ли делать его числом?

В файле

001250

→

Прочитан как число

1250

Для идентификатора явно сохраняем текстовый тип:

pd.read_csv("orders.csv", sep=";",
            dtype={"postal_code": "string"})

Автоматическое распознавание типа может изменить данные.

11 / 23

Разделитель встретился внутри адреса

125;001250;"Москва; склад 2"

Сколько здесь полей?

125001250Москва; склад 2
заказиндексадрес

Кавычки позволяют сохранить разделитель внутри одного поля.

12 / 23

В заказе несколько товаров

XML показывает структуру с помощью тегов и вложенности.

<order id="125">
  <recipient>Анна</recipient>
  <items>
    <item quantity="2">
      Книга
    </item>
  </items>
</order>

Элемент
recipient

Атрибут
quantity="2"

Вложенность
товар внутри списка

13 / 23

Текст, который рисует картинку

SVG — пример специализированного языка на основе XML.

<svg xmlns="http://www.w3.org/2000/svg"
     viewBox="0 0 200 120">
  <rect x="30" y="20"
        width="140" height="80"
        fill="#BDD3BA"
        stroke="#1F3433" />
</svg>
Шалфейный прямоугольник с тёмным контуром, нарисованный приведённым SVG-кодом

Один файл можно прочитать как текст
и показать как изображение.

14 / 23

Знакомый заказ в JSON

{
  "id": 125,
  "recipient": "Анна",
  "items": [
    {"title": "Книга", "quantity": 2}
  ],
  "paid": true
}

{ } объект

[ ] массив

"Анна" строка

125 число

true логическое значение

Читаемая структура ещё не гарантирует правильность данных.

15 / 23

Три ошибки — три проверки

01
{"weight_grams": 1500
Синтаксис

Объект не закрыт.

02
{"weight_grams": "1500"}
Схема

Ожидалось число,
пришла строка.

03
{"weight_grams": 1.5}
Смысл

Отправитель имел в виду
1,5 кг. Поле — в граммах.

Что обнаружит парсер? Что — схема? Что требует знания задачи?

16 / 23

Что проверяет схема?

{
  "type": "object",
  "properties": {
    "weight_grams": {
      "type": "integer",
      "minimum": 1
    }
  },
  "required": ["weight_grams"]
}

Целое число
Строка "1500" не подходит.

Не меньше 1
Ноль не подходит.

Обязательное поле
Его нельзя пропустить.

17 / 23

Новое поле: старый клиент выживет?

Первый ответ API

{
  "id": 125,
  "status": "created"
}

После обновления

{
  "id": 125,
  "status": "created",
  "courier_phone": null
}

Зависит от правил клиента: допускает ли он новые поля
и сохранился ли смысл прежних?

Совместимость нужно проектировать и проверять.

18 / 23

Вы уже писали YAML

Заявка на поддомен из лабораторной №5.

subdomain: ivan-ivanov
type: CNAME
target: ivan123.github.io
repository: https://github.com/ivan123/my-lab-site

Ключи, значения и автоматическая проверка.

Учебная заявка record.yaml
Редактирование YAML-заявки на поддомен в GitHub, иллюстрация из лабораторной 5

Человек заполняет поля.
Проверка PR сверяет правила.

19 / 23

Читается легко — ошибиться всё ещё можно

Порт относится к api

services:
  api:
    image: example/api:latest
    ports:
      - "8080:8000"

Изменили отступ

services:
  api:
    image: example/api:latest
  ports:
    - "8080:8000"

Справа изменилось дерево: ports больше не внутри api.
Корректный YAML может нарушать правила Docker Compose.

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

20 / 23

Почему существуют разные представления?

GZIP / Zstandard

Уменьшить размер уже выбранного представления.

Protobuf

Передавать бинарные сообщения по схеме.
Соблюдать правила её изменения.

Parquet

Хранить таблицу по колонкам
для аналитической обработки.

Выбор зависит от задачи: читаемость, размер, обработка, совместимость.

21 / 23

В одной системе живут разные форматы

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

СИСТЕМА ДОСТАВКИЗаказ №125Анна · книга × 2
База данныхshipmentsсохранить заказ
API{ "id": 125 }вернуть приложению
CSV125;Москва;1500выгрузить отчёт
YAMLtype: CNAMEпроверить настройку

Одна система может использовать разные форматы
для разных задач.

22 / 23

Что выберете вы?

Для каждого случая назовите подход и одну важную договорённость.

Ответ мобильному приложению

JSON + контракт API
Поля, типы и условия совместимости.

Таблица для коллеги

CSV или XLSX
Типы, кодировка, правила импорта.

Настройки сервиса

Поддерживаемый формат
YAML / TOML / JSON и проверка правил.

Векторная графика

SVG / XML
Изображение остаётся чётким при масштабировании.

Передать байты мало — нужно согласовать, как их понимать.

23 / 23