Programming

Форматы файлов

Формат файла — соглашение о том, как данные закодированы внутри файла, чтобы программа могла их правильно прочитать и записать.

Что такое формат файла

Формат файла — соглашение о том, как данные закодированы внутри. Для диска любой файл — просто последовательность байтов; смысл этим байтам придаёт формат: где заголовок, где данные, каким алгоритмом сжато.

Расширение (.png, .csv) — всего лишь подсказка имени файла, а не сам формат. Переименовать photo.jpg в photo.png не превратит его в PNG. Реальный тип определяют по сигнатуре — первым байтам файла (magic bytes):

file image.png
# image.png: PNG image data, 1920 x 1080, 8-bit/color RGBA, non-interlaced

xxd -l 8 image.png
# 00000000: 8950 4e47 0d0a 1a0a    .PNG....

PNG — что это

PNG (Portable Network Graphics) — растровый формат изображений со сжатием без потерь, опубликованный в 1996 году. Создавался как замена GIF, на который тогда распространялись патентные ограничения алгоритма LZW.

Ключевые свойства:

  • Без потерь. Сохранили, открыли, пересохранили — байты пикселей те же. Качество не деградирует от пересохранений, в отличие от JPEG.
  • Альфа-канал. Полноценная прозрачность с 256 градациями (у GIF прозрачность была бинарной).
  • Сжатие DEFLATE — тот же алгоритм, что в zip и gzip.
  • Сигнатура 89 50 4E 47 0D 0A 1A 0A — байты 2–4 читаются как PNG.
  • Не поддерживает анимацию в базовом стандарте (это расширение APNG) и не поддерживает CMYK — для печати не годится.

PNG отлично жмёт то, где много одинаковых пикселей: скриншоты, логотипы, схемы, текст, графики. И плохо — фотографии: там у каждого пикселя свой оттенок, повторов нет, и PNG-файл фотографии выйдет в 5–10 раз тяжелее JPEG при неотличимой на глаз разнице.

Форматы изображений

Формат Сжатие Прозрачность Где уместен
PNG Без потерь Да, альфа-канал Скриншоты, логотипы, графика с текстом
JPEG С потерями Нет Фотографии
WebP Оба режима Да Веб — обычно легче PNG и JPEG
AVIF Оба режима Да Веб, сжимает сильнее WebP
GIF Без потерь, 256 цветов Бинарная Только простая анимация
SVG Вектор, текст Да Иконки, логотипы, любой масштаб

Правило выбора: фотография — JPEG или WebP; графика с резкими краями и текстом — PNG; иконки и логотипы — SVG.

CSV — что это за формат

CSV (Comma-Separated Values) — текстовая таблица: строка файла = строка таблицы, значения разделены запятыми. Первая строка обычно содержит заголовки.

id,name,amount
1,"Иванов, Пётр",1500
2,Петров,2300

Формат описан в RFC 4180, но на практике соблюдается плохо, и отсюда все проблемы: в русской локали разделителем часто становится ; (потому что запятая занята под десятичную дробь), кодировка гуляет между UTF-8 и Windows-1251, а значения с запятой внутри требуют кавычек. Поэтому парсинг CSV регулярным выражением — плохая идея; берите готовую библиотеку (csv в Python, pandas).

Плюсы: читается глазами, открывается везде, легко генерируется. Минусы: нет типов (всё строки), нет схемы, большие файлы читаются медленно.

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

Формат Тип Сильная сторона Слабая сторона
JSON Текст Стандарт для API Многословен, нет комментариев
YAML Текст Читаемость, конфиги Значимые отступы, коварные типы
XML Текст Схемы, валидация Тяжеловесен
CSV Текст Таблицы, универсальность Нет типов и схемы
Parquet Бинарный, колоночный Аналитика на больших объёмах Не читается глазами

Для Big Data колоночный Parquet вытесняет CSV: он хранит схему и типы, жмёт данные в разы плотнее и позволяет читать только нужные колонки, не разбирая файл целиком.

Сжатие файлов

Сжатие — устранение избыточности данных. Два принципиально разных класса:

  • Без потерь (zip, gzip, PNG, FLAC) — исходные байты восстанавливаются точно. Обязательно для кода, текста, таблиц.
  • С потерями (JPEG, MP3, H.264) — часть информации выбрасывается навсегда, но так, чтобы человек не заметил. Даёт кратно меньший размер, но подходит только для медиа.

Практическое сравнение алгоритмов без потерь: gzip — универсальный компромисс и стандарт для HTTP; zstd — жмёт как gzip, но заметно быстрее, и потому вытесняет его в бэкапах; xz — жмёт сильнее всех, но медленно, уместен при однократной упаковке и многократном скачивании.

tar -czf backup.tar.gz data/          # gzip — универсально
tar -I 'zstd -19' -cf backup.tar.zst data/   # zstd — быстрее при схожем размере

Уже сжатое повторно не сжимается: класть JPEG или PNG в zip почти бессмысленно — выигрыш будет в единицы процентов.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер