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

К концу этого руководства у вас будет пять готовых сниппетов: CSV в XLSX, JSON в CSV, XLSX обратно в CSV, картинка PNG в JPEG и HTML в PDF. Каждый фрагмент копируется и запускается как есть. На всё уйдёт минут тридцать вместе с установкой пакетов. Никакого разбора внутренностей — только результат.
Все примеры проверены на Python 3.11 и 3.12. Библиотеки указаны рядом с кодом; ставим их через pip перед запуском.
Что нужно иметь до начала
- Python 3.10 или новее. Проверьте:
python --versionдолжна вывестиPython 3.11.xили выше. - Умение ставить пакеты через
pipи запускать скрипт из терминала. - Для конвертации HTML в PDF — установленный системный пакет wkhtmltopdf (об этом ниже, это отдельный шаг, а не pip-пакет).
- Тестовый файл того формата, что собираетесь конвертировать, в той же папке, что и скрипт.
Ставим сразу всё, что понадобится для примеров:
pip install pandas openpyxl Pillow pdfkitЗдесь pandas — для таблиц, openpyxl — движок для Excel-файлов, Pillow — для изображений, pdfkit — обёртка над wkhtmltopdf.
1. CSV в Excel (XLSX)
Самая частая задача: отдать коллеге таблицу, которую он откроет двойным кликом. pandas читает CSV и пишет XLSX в две строки.
import pandas as pd
# read_csv по умолчанию ждёт запятую-разделитель и UTF-8.
# Русский CSV из Excel часто в cp1251 и с точкой с запятой — задаём явно.
data_frame = pd.read_csv("orders.csv", sep=";", encoding="cp1251")
# index=False — чтобы не писать лишний столбец с номерами строк
data_frame.to_excel("orders.xlsx", index=False)
print("Готово, строк записано:", len(data_frame))Проверка: в папке появился файл orders.xlsx, в терминале — строка Готово, строк записано: N. Откройте файл в Excel или LibreOffice — столбцы на месте, кириллица читается.
Разделитель и кодировка
Если ваш CSV сохранён в UTF-8 и разделён запятыми, уберите аргументы sep и encoding — сработают значения по умолчанию. Точку с запятой и cp1251 оставляют файлы, выгруженные из русской версии Excel.
2. JSON в CSV
JSON приходит от API, а аналитику нужна плоская таблица. Если структура — это список одинаковых словарей, pandas разложит его сам.
import pandas as pd
# JSON вида [{"id": 1, "name": "..."}, {"id": 2, "name": "..."}]
data_frame = pd.read_json("users.json")
# utf-8-sig добавляет BOM, чтобы Excel не ломал кириллицу при открытии CSV
data_frame.to_csv("users.csv", index=False, encoding="utf-8-sig")
print("Колонки:", list(data_frame.columns))Проверка: файл users.csv открывается в Excel без кракозябр, в терминале видно список колонок.
Если JSON вложенный — поля со словарями внутри словарей — read_json положит вложенный объект в одну ячейку как текст. Разворачивание вложенности делается через pandas.json_normalize; это отдельная тема, здесь остаёмся на плоских данных.
3. Excel (XLSX) в CSV
Обратная дорога. У книги Excel может быть несколько листов — по умолчанию читается первый.
import pandas as pd
# sheet_name=0 — первый лист; можно передать имя листа строкой
data_frame = pd.read_excel("report.xlsx", sheet_name=0)
data_frame.to_csv("report.csv", index=False, encoding="utf-8-sig")
print("Готово")Проверка: рядом лежит report.csv с теми же данными, что были на первом листе.
4. Конвертация изображений (PNG в JPEG)
PNG хранит прозрачность, JPEG — нет. При прямом сохранении PNG с прозрачным фоном в JPEG вы получите ошибку или чёрный фон. Прозрачность нужно свести на белый заранее.
from PIL import Image
image = Image.open("logo.png")
# Если есть альфа-канал, подкладываем белый фон
if image.mode in ("RGBA", "LA", "P"):
background = Image.new("RGB", image.size, (255, 255, 255))
# convert("RGBA") нужен, если исходник в палитровом режиме P
background.paste(image.convert("RGBA"), mask=image.convert("RGBA").split()[-1])
image = background
else:
image = image.convert("RGB")
# quality от 1 до 95; выше 95 Pillow не рекомендует
image.save("logo.jpg", "JPEG", quality=90)
print("Сохранено:", image.size)Проверка: появился logo.jpg, фон белый, размер совпадает с оригиналом. Библиотека — Pillow 10.x или 11.x.
5. HTML в PDF
Этот пример требует системную программу, а не только pip-пакет. pdfkit — это обёртка, которая вызывает wkhtmltopdf. Без него скрипт упадёт.
Установка wkhtmltopdf
- Windows: скачайте установщик с официального сайта wkhtmltopdf, запомните путь к
wkhtmltopdf.exe. - Linux (Debian/Ubuntu):
sudo apt install wkhtmltopdf. - macOS:
brew install wkhtmltopdf.
import pdfkit
# Если wkhtmltopdf не в PATH (частый случай на Windows) — укажите путь явно
# config = pdfkit.configuration(wkhtmltopdf=r"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe")
# pdfkit.from_file("page.html", "page.pdf", configuration=config)
# Если бинарник в PATH, хватит одной строки:
pdfkit.from_file("page.html", "page.pdf")
print("PDF готов")Проверка: появился page.pdf, открывается и содержит вёрстку исходной страницы.
Больше половины проблем при конвертации — это не про формат, а про кодировку. Прежде чем искать баг в библиотеке, откройте исходный файл в редакторе и проверьте, в UTF-8 он или в cp1251.
Если не получилось
UnicodeDecodeError: 'utf-8' codec can't decode byte...— CSV не в UTF-8. Добавьтеencoding="cp1251"вread_csv. Не угадали кодировку — попробуйте определить её через пакетchardet.- Кириллица превратилась в кракозябры в Excel — при записи CSV укажите
encoding="utf-8-sig". Обычныйutf-8без BOM русский Excel открывает неправильно. ModuleNotFoundError: No module named 'openpyxl'—to_excelтребует движок. Выполнитеpip install openpyxl.OSError: cannot write mode RGBA as JPEG— вы пытаетесь сохранить прозрачный PNG в JPEG напрямую. Сведите фон, как в примере 4.OSError: No wkhtmltopdf executable found— программа не установлена или не в PATH. Установите её и/или передайте путь черезpdfkit.configuration.
Что делать дальше
Разобравшись с одиночными файлами, автоматизируйте пакетную обработку: пройдитесь glob.glob("*.csv") по папке и конвертируйте всё разом. Для форматов, которых нет в этом руководстве — DOCX, ODS, Parquet — смотрите таблицу поддерживаемых форматов в документации pandas и раздел форматов в документации Pillow. Если конвертация станет частью сервиса, а не разовым скриптом, оборачивайте каждый вызов в try/except и логируйте имя файла, на котором упало, — иначе на батче из тысячи файлов вы не найдёте проблемный.
Редактор изображений: Убрать лишнее, заменить фон, добавить объект, расширить кадр — на вашем изображении.
Спросить за 20 ₽Источники: pandas — IO tools (форматы ввода-вывода), Pillow — Image file formats
Частые вопросы
А если у меня Python 3.9 или старее?
Почему в Excel вместо русских букв кракозябры, хотя код отработал без ошибок?
Можно ли конвертировать файлы без pandas?
Как конвертировать сразу все файлы в папке?
wkhtmltopdf для HTML в PDF — обязателен? Есть альтернативы?
Вложенный JSON разворачивается в CSV автоматически?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.