Итоговый проект — учёт расходов

Программа, которой можно пользоваться каждый день, а не учебный пример

Прогресс курса Модуль 9 из 9

Что покажет проект

01

Постановка

Нужна программа budget для учёта личных расходов. Каждая трата — запись: дата, сумма, категория, комментарий. Программа добавляет и удаляет записи, показывает список за месяц, строит отчёт по категориям и выгружает данные в таблицу. Данные хранятся в файле budget.json и не теряются между запусками. Так выглядит работа с эталонным решением (Debian 13, Python 3.13):

$ python3 budget.py -h
usage: budget [-h] [-f FILE] КОМАНДА ...

Учёт расходов.

positional arguments:
  КОМАНДА
    add            добавить расход
    list           список расходов
    report         отчёт по категориям
    delete         удалить запись по номеру
    export         выгрузить в CSV для Excel

options:
  -h, --help       show this help message and exit
  -f, --file FILE  файл данных (по умолчанию budget.json)
$ python3 budget.py add 4250,80 Продукты -c "Лента, неделя" -d 2026-10-01
Добавлено: №1, 2026-10-01, 4 250,80 руб., продукты
$ python3 budget.py add 1990 связь -c "мобильный и интернет" -d 01.10.2026
Добавлено: №2, 2026-10-01, 1 990,00 руб., связь
…
$ python3 budget.py list -m 2026-10
   №  Дата         Сумма, руб.  Категория     Комментарий
   1  2026-10-01      4 250,80  продукты      Лента, неделя
   2  2026-10-01      1 990,00  связь         мобильный и интернет
   3  2026-10-03        650,00  транспорт     Подорожник
   5  2026-10-05     12 500,00  аренда        доля за октябрь
   4  2026-10-08      2 899,90  продукты
   7  2026-10-15        320,00  кафе
Итого: 22 610,70 руб., записей: 6
$ python3 budget.py report -m 2026-10
Расходы за 2026-10

аренда          12 500,00   55%  █████████████████
продукты         7 150,70   32%  █████████
связь            1 990,00    9%  ███
транспорт          650,00    3%  █
кафе               320,00    1%
итого           22 610,70

Ошибки ввода не роняют программу и не портят данные:

$ python3 budget.py add сто кафе
budget: ошибка: сумма должна быть числом: 'сто'
$ python3 budget.py add 500 кафе -d 31.02.2026
budget: ошибка: нет такой даты или формат не ГГГГ-ММ-ДД / ДД.ММ.ГГГГ: 31.02.2026
$ python3 budget.py delete 7
Удалено: №7, 2026-10-15, 320,00 руб., кафе
$ python3 budget.py delete 7
budget: ошибка: нет записи №7
$ python3 budget.py export october.csv -m 2026-10
Выгружено записей: 5 -> october.csv

Формат вывода, имена команд и текст сообщений можно выбрать свои. Обязательны возможности и поведение из раздела 02.

02

Что должно получиться

ТребованиеМодуль
Команды: добавить, список, отчёт, удалить, выгрузить; справка -h у программы и у каждой команды08
Никаких input: всё через аргументы, чтобы программу можно было вызывать из скриптов08
Сумма с точкой или запятой, без погрешности float: хранение в копейках (int) или Decimal02
Дата в двух форматах, проверка существования даты; без даты — сегодня04, 06
Отбор за месяц, группировка по категориям, доля каждой, сортировка по убыванию05
Хранение в JSON с ensure_ascii=False; первый запуск без файла работает07
Неверный ввод и повреждённый файл — сообщение в stderr и ненулевой код возврата, без traceback07
Выгрузка в CSV, которая открывается в русском Excel без «кракозябр»07
Код в двух модулях: хранение отдельно от команд; функции с docstring06
Проверки на assert для разбора суммы и даты06

Порядок работы

  • Сначала функции разбора: parse_amount("99,90") → 9990 копеек, parse_date("05.10.2026") → "2026-10-05". Сразу — проверки на assert с правильными и неправильными значениями.
  • Затем модуль хранения: load и save. Проверьте первый запуск без файла и файл, оборванный на середине.
  • Затем команды add и list — уже можно пользоваться. Потом report, delete, export.
  • В конце — прогон всех ошибок: неверная сумма, несуществующая дата, удаление несуществующей записи, неизвестная команда. После каждого — echo $?.
Подкоманды в argparse создаются через parser.add_subparsers(): у каждой свой набор аргументов, как у git commit и git log. Пример — в документации модуля, раздел «Sub-commands». Чтобы запись файла не оборвалась на середине, пишите во временный файл и заменяйте основной через os.replace.

Подробные требования, что сдаётся и критерии оценивания — в задании на портале.

Практические задания — на учебном портале. Задания, критерии оценивания, сдача работ и оценки преподавателя — в курсе на portal.nevabit.ru. Учётную запись выдаёт преподаватель.

Курс пройден

Вы прошли курс «Основы Python». Дальше — курсы «Основы SQL» (хранить данные в базе вместо JSON), «Основы тестирования ПО» (автотесты на Python) и «Основы Git» (вести проект в репозитории).

Модуль 08: Автоматизация Все модули Все курсы