Кейс · Бэкенд · Python

csv-doctor: профиль и очистка CSV

Сервис проверки и очистки CSV на Python (FastAPI, без pandas). Загружаете файл до 5 МБ: определяются кодировка (utf-8, cp1251, koi8-r, UTF-16 с BOM) и разделитель, строится профиль колонок и список проблем с номерами строк и подсказками, затем можно скачать очищенный CSV. Опасные ячейки (=, +, -, @) ловятся как CSV-injection. Файл разбирается в памяти и нигде не сохраняется.

  • Python
  • FastAPI
  • uvicorn
  • hypothesis
  • mypy --strict
  • ruff
  • pip-audit
  • Docker
  • GitHub Actions

01 · Как выглядит

Скриншоты

Скриншот проекта «csv-doctor: профиль и очистка CSV» на экране 1280 пикселей
Десктоп, 1280 px
Скриншот проекта «csv-doctor: профиль и очистка CSV» на экране телефона, 390 пикселей
Телефон, 390 px

02 · О проекте

Что это и зачем

Сервис проверки и очистки CSV на Python (FastAPI, без pandas). Загружаете файл до 5 МБ: определяются кодировка (utf-8, cp1251, koi8-r, UTF-16 с BOM) и разделитель, строится профиль колонок и список проблем с номерами строк и подсказками, затем можно скачать очищенный CSV. Опасные ячейки (=, +, -, @) ловятся как CSV-injection. Файл разбирается в памяти и нигде не сохраняется.

Ограничения

Образ 202 МБ: в основном базовый python:3.12-slim.

Пик памяти около 115 МиБ на очистке файла 3,8 МБ; одновременных разборов не больше четырёх.

Скорость около 1100 запросов в секунду замерена клиентом на той же машине: это проверка устойчивости, не бенчмарк.

Проект работает на небольшом VPS с демо-данными: без отказоустойчивости и резервных копий.

Что внутри

  • Автоопределение кодировки и разделителя, профиль колонок, выбросы по 1.5·IQR, неоднозначные даты
  • Защита от CSV-injection на входе (ошибка) и на выходе очистки (апостроф), телефоны +7 не ломаются
  • 43 теста; hypothesis: круговой проход кодировок, идемпотентность очистки clean(clean(x)) == clean(x)
  • CI: ruff, mypy --strict, pytest --cov, pip-audit по хэш-закреплённому requirements.lock; файл 3,8 МБ (95 000 строк) разбирается за 1,5 с

03 · Как запустить

Запуск одной командой

git clone <репозиторий по запросу> csv-doctor
cd csv-doctor
python -m app

04 · Код

Репозиторий приватный

Исходники лежат в приватном репозитории. Напишите в Telegram, открою доступ.

Запросить код