Кейс · Бэкенд · 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 · Как выглядит
Скриншоты


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 app04 · Код
Репозиторий приватный
Исходники лежат в приватном репозитории. Напишите в Telegram, открою доступ.
Запросить код