← Назад к вопросам

Какие знаешь форматы данных?

1.0 Junior🔥 191 комментариев
#Python Core#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Форматы данных в веб-разработке

Знание различных форматов данных критично для разработчика Python. Разберём основные форматы, их особенности и применение.

1. JSON (JavaScript Object Notation)

Самый популярный формат для обмена данными:

import json
from typing import Any

# Сериализация (объект -> JSON строка)
data = {
    "name": "John",
    "age": 30,
    "email": "john@example.com",
    "is_active": True,
    "tags": ["python", "fastapi"],
    "nested": {"city": "NYC", "zip": "10001"}
}

json_string = json.dumps(data, indent=2)
print(json_string)

# Запись в файл
with open("data.json", "w") as f:
    json.dump(data, f, indent=2, ensure_ascii=False)

# Десериализация (JSON строка -> объект)
json_data = '{"name": "Alice", "age": 25}'
parsed = json.loads(json_data)
print(parsed["name"])  # Alice

Плюсы: Универсальный, читаемый, встроенная поддержка Минусы: Больше памяти, чем бинарные форматы

2. XML (eXtensible Markup Language)

Структурированный текстовый формат:

from xml.etree import ElementTree as ET
from xml.dom import minidom

# Парсинг XML
xml_string = """<users>
    <user>
        <name>John</name>
        <age>30</age>
    </user>
    <user>
        <name>Alice</name>
        <age>25</age>
    </user>
</users>"""

root = ET.fromstring(xml_string)

# Итерация по элементам
for user in root.findall("user"):
    name = user.find("name").text
    age = user.find("age").text
    print(f"{name}: {age}")

Плюсы: Структурированный, поддержка атрибутов Минусы: Многословный, большой размер файла

3. YAML

Читаемый формат для конфигураций:

import yaml

# Парсинг YAML
yaml_string = """
server:
  host: localhost
  port: 8000
database:
  driver: postgresql
  user: admin
"""

config = yaml.safe_load(yaml_string)
print(config["server"]["host"])  # localhost

Плюсы: Очень читаемый, хорошо для конфигов Минусы: Медленнее JSON

4. CSV (Comma-Separated Values)

Табличный формат для данных:

import csv

# Чтение CSV
with open("users.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row["name"], row["email"])

# Запись CSV
users = [
    {"name": "John", "email": "john@example.com"},
    {"name": "Alice", "email": "alice@example.com"}
]

with open("users.csv", "w", newline="") as f:
    fieldnames = ["name", "email"]
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(users)

Плюсы: Простой, компактный, Excel совместимый Минусы: Нет иерархии, проблемы с кавычками

5. Protocol Buffers (protobuf)

Бинарный формат от Google:

# Определение схемы в user.proto
# syntax = "proto3";
# message User {
#   int32 id = 1;
#   string name = 2;
#   string email = 3;
# }

from user_pb2 import User

# Создание
user = User(id=1, name="John", email="john@example.com")

# Сериализация
data = user.SerializeToString()

# Десериализация
user2 = User()
user2.ParseFromString(data)
print(user2.name)  # John

Плюсы: Компактный, быстрый, строгая схема Минусы: Требует кодогенерации

6. MessagePack

Компактный бинарный формат:

import msgpack

data = {"name": "John", "age": 30}

# Сериализация
packed = msgpack.packb(data)

# Десериализация
unpacked = msgpack.unpackb(packed, raw=False)
print(unpacked["name"])  # John

Плюсы: Очень компактный, быстрый Минусы: Не читаемый

Сравнение форматов

ФорматРазмерСкоростьЧитаемостьСхемаПрименение
JSONБольшойСредняяОтличнаяНетAPI, веб
XMLОчень большойНизкаяХорошаяДаLegacy системы
YAMLСреднийСредняяОтличнаяНетКонфигурация
CSVСреднийСредняяХорошаяНетТабличные данные
ProtobufМалыйОчень высокаяНетДаМикросервисы
MessagePackОчень малыйВысокаяНетНетReal-time системы

Рекомендации по выбору

  • JSON: Для API и веб-приложений (выбор по умолчанию)
  • YAML: Для конфигураций и human-readable данных
  • CSV: Для табличных данных и экспорта
  • Protobuf: Для высокопроизводительных микросервисов
  • MessagePack: Для компактных данных в real-time системах
  • XML: Для SOAP, WSDL, legacy систем
  • Pickle: Только для кеша (никогда не десериализируй untrusted данные)

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