Конвертация форматов файлов в Python: что знать до начала
Разбираемся, какие библиотеки ставить для конвертации CSV, JSON, Excel и изображений, чем отличается кодировка от формата и почему первый же файл на кириллице ломает вывод.

Через полчаса у вас будет рабочий набор из нескольких библиотек, которыми можно превращать CSV в Excel, JSON в CSV, PNG в WebP и один текст в другую кодировку. Первую конвертацию сделаете за пять-десять минут. Дальше сложность не в коде, а в мелочах: кодировка, разделитель, потеря типов данных. С них и начнём.
Статья про базовые форматы: табличные данные, JSON и изображения. PDF, DOCX и аудио-видео — отдельная история со своими библиотеками, здесь их не трогаем.
Что нужно иметь до начала
Проверьте перед первой строкой кода:
- Python 3.10 или новее. Команда
python --versionдолжна показать номер. На части систем нужно писатьpython3. - Установленный
pip. Проверка:pip --version. - Права на установку пакетов. Если
pip installругается на доступ — работайте в виртуальном окружении, а не черезsudo. - Файл-образец, на котором будете проверять. Возьмите свой реальный файл, а не идеальный из примера: реальные данные ломают конвертацию чаще.
Виртуальное окружение — отдельная папка с изолированным набором пакетов, чтобы проект не конфликтовал с системным Python.* Создаётся так:
python -m venv venv
# Linux/macOS:
source venv/bin/activate
# Windows (PowerShell):
venv\Scripts\Activate.ps1
После активации в начале строки терминала появится (venv). Это значит, что pip install ставит пакеты в окружение проекта.
Какие библиотеки ставить под какой формат
Стандартной библиотеки Python хватает для CSV и JSON: модули csv и json идут в комплекте, ставить ничего не надо. Для Excel и изображений нужны сторонние пакеты.
| Задача | Библиотека | Установка | В комплекте Python |
|---|---|---|---|
| CSV читать/писать | модуль csv | — | да |
| JSON читать/писать | модуль json | — | да |
| Excel (.xlsx) | openpyxl | pip install openpyxl | нет |
| Таблицы любого вида | pandas | pip install pandas openpyxl | нет |
| Изображения | Pillow | pip install Pillow | нет |
Версии на момент написания: pandas 2.x, openpyxl 3.x, Pillow 11.x. Точные текущие версии смотрите на PyPI — API этих пакетов между мажорными версиями меняется, особенно у pandas.
Для записи .xlsx через pandas всё равно нужен openpyxl — pandas сам его не тянет как обязательную зависимость, поэтому ставьте пару.
Первая конвертация: CSV в Excel
Пошагово, код целиком, копируется и запускается.
- Установите пакеты:
pip install pandas openpyxl. В конце вывода должно появитьсяSuccessfully installed. - Положите рядом со скриптом файл
data.csv— любой ваш CSV. - Создайте файл
convert.pyс таким содержимым:
# pandas 2.x, openpyxl 3.x
import pandas as pd
# Читаем CSV. Кодировку и разделитель задаём явно —
# по умолчанию pandas ждёт запятую и UTF-8.
tablitsa = pd.read_csv("data.csv", encoding="utf-8", sep=",")
# Пишем в Excel без служебного столбца с индексом.
tablitsa.to_excel("data.xlsx", index=False)
print("Готово, строк:", len(tablitsa))
- Запустите:
python convert.py. В терминале появится строкаГотово, строк: N, а рядом со скриптом — файлdata.xlsx. - Откройте
data.xlsxв Excel или LibreOffice. Кириллица не должна превратиться в кракозябры, числа должны остаться числами.
Формат и кодировка — разные вещи. .csv — это формат: текст, разделённый запятыми. UTF-8 или Windows-1251 — это кодировка того же текста. Файл может быть валидным CSV и при этом открываться абракадаброй, если угадали формат, но не угадали кодировку.
JSON в CSV без сторонних пакетов
Если JSON — это список одинаковых по структуре объектов, стандартной библиотеки достаточно.
# Только стандартная библиотека, Python 3.10+
import json
import csv
with open("data.json", encoding="utf-8") as f:
zapisi = json.load(f) # ожидаем список словарей
# Берём ключи из первого объекта как заголовки столбцов.
zagolovki = list(zapisi[0].keys())
# newline="" обязателен, иначе на Windows появятся пустые строки.
with open("data.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=zagolovki)
writer.writeheader()
writer.writerows(zapisi)
print("Записано строк:", len(zapisi))
Проверка: открылся data.csv, первая строка — заголовки, дальше данные. Если JSON вложенный (объекты внутри объектов), плоскую таблицу так не получить — нужно решить, какие поля разворачивать, и это уже не про одну строку кода.
Конвертация изображений
Pillow меняет формат по расширению выходного файла. PNG в WebP:
# Pillow 11.x
from PIL import Image
kartinka = Image.open("foto.png")
# WebP не поддерживает режим с палитрой у части картинок —
# приводим к RGB, чтобы не словить ошибку сохранения.
if kartinka.mode in ("P", "RGBA"):
kartinka = kartinka.convert("RGB")
kartinka.save("foto.webp", quality=80)
print("Сохранено:", kartinka.size)
Проверка: рядом появился foto.webp, он открывается и весит меньше исходника. Параметр quality для WebP и JPEG задаёт компромисс между размером и качеством; для PNG он не действует.
Если не получилось
UnicodeDecodeError: 'utf-8' codec can't decode byte...— файл в другой кодировке. Для выгрузок из 1С и старого Excel часто это Windows-1251. Передайтеencoding="cp1251"вread_csvилиopen.- Кириллица открывается кракозябрами в Excel, хотя код отработал. Excel по умолчанию читает CSV в системной кодировке, а не UTF-8. Для CSV под Excel помогает
encoding="utf-8-sig"при записи — добавит метку BOM, по которой Excel опознаёт UTF-8. К.xlsxэто не относится. ModuleNotFoundError: No module named 'openpyxl'— пакет не установлен или установлен в другое окружение. Проверьте, что активированvenv, и поставьте заново.- Столбцы CSV не разделились, всё в одной ячейке. Разделитель не запятая. В русских выгрузках часто точка с запятой — укажите
sep=";". KeyErrorилиIndexErrorпри JSON в CSV. Список пуст либо объекты в JSON с разным набором ключей. Заголовки нужно собирать по всем объектам, а не только по первому.
Что делать дальше
Когда базовая конвертация заработала, следующие шаги по мере роста задач:
- Большие файлы: если CSV не влезает в память, читайте частями через параметр
chunksizeвpd.read_csv— документация pandas по I/O покажет актуальный синтаксис. - Типы данных: pandas угадывает типы при чтении и иногда превращает телефон или артикул в число с потерей ведущих нулей. Смотрите в сторону явного указания типов столбцов.
- Автоматизация: обернуть скрипт в приём аргументов командной строки, чтобы не править путь к файлу в коде.
Дату и кодировку исходных файлов фиксируйте в самом коде комментарием — через полгода вы не вспомните, что эта выгрузка приходит в cp1251.
* Виртуальное окружение (venv) — изолированная папка с копией интерпретатора и своим набором пакетов. Нужна, чтобы версии библиотек одного проекта не ломали другой проект на той же машине.
Редактор изображений: Убрать лишнее, заменить фон, добавить объект, расширить кадр — на вашем изображении.
Спросить за 20 ₽Источники: pandas — IO tools (документация), Pillow — Handbook (документация)
Частые вопросы
А если у меня Python 3.8 или другая версия?
Код отработал без ошибок, но в Excel кириллица — набор символов. Что не так?
Как узнать кодировку файла, если она неизвестна?
Нужен ли pandas, если я работаю только с CSV и JSON?
Конвертация ломается на одном файле из ста в проде — что чаще всего причина?
Теряются ли данные при конвертации?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.