Ввод-вывод, файлы, исключения и мини-проект
Связь с предыдущими темами
Ранее вы научились писать программы с условиями и циклами, выносить логику в функции, разбивать код на модули и выбирать структуры данных под задачу. Теперь сделаем следующий практический шаг: научим программы
общаться с внешним миром.
В этой статье вы освоите:
ввод и вывод данных более осмысленно (не только print и input)
чтение и запись файлов
обработку ошибок через исключения
сборку мини-проекта, который объединяет все навыки!Общая схема: от ввода пользователя до чтения/записи файлов и вывода результата
Ввод-вывод в консоли
print как инструмент форматирования
print умеет больше, чем просто печатать строку.
Печать нескольких значений через пробел по умолчанию
Управление разделителем через sep
Управление окончанием строки через endinput всегда возвращает строку
Даже если пользователь ввёл число,
input возвращает
str. Поэтому для чисел нужно явное приведение типов.
> Если пользователь введёт не число (например, abc), то int(...) выбросит исключение. В разделе про исключения вы научитесь это обрабатывать.
Файлы: зачем они нужны
Файлы позволяют программе:
хранить данные между запусками
обрабатывать большие объёмы данных (логи, списки, выгрузки)
обмениваться данными с другими программамиВ Python работа с файлами строится вокруг функции open.
Документация:
openОткрытие файла и менеджер контекста with
Почему важно использовать with
Файл нужно закрывать. Если забыть закрыть файл, можно получить:
утечки ресурсов
проблемы с записью (данные не успели “сброситься” на диск)
блокировки файла в некоторых ОСПравильный способ в Python — использовать менеджер контекста with, который гарантированно закроет файл.
Здесь:
"data.txt" — путь к файлу
"r" — режим чтения
encoding="utf-8" — кодировка (почти всегда правильный выбор для текстовых файлов)
as f — переменная, через которую вы работаете с файломРежимы открытия файла
Ниже самые частые режимы для текстовых файлов.
| Режим | Что делает | Если файла нет | Если файл есть |
|---|---|---|---|
| "r" | чтение | ошибка | читает |
| "w" | запись | создаст | перезапишет |
| "a" | добавление в конец | создаст | допишет |
| "r+" | чтение и запись | ошибка | читает и пишет |
Практическое правило:
для чтения используйте "r"
для генерации результата “с нуля” используйте "w"
для логов и накопления данных используйте "a"Чтение текстовых файлов
Прочитать файл целиком: read
Подходит для небольших файлов.
Прочитать файл построчно
Построчное чтение лучше для больших файлов: вы не загружаете всё в память сразу.
Здесь rstrip("\n") убирает перевод строки в конце строки (чтобы печать была аккуратнее).
readline и readlines
Используются реже, но важно знать:
readline() читает одну строку
readlines() читает все строки и возвращает список строкДокументация:
Text I/OЗапись текстовых файлов
Перезапись: режим w
Важно:
write не добавляет перевод строки автоматически
"w" удалит старое содержимое файлаДозапись: режим a
Пути к файлам: относительные и абсолютные
Относительный путь
"data.txt" — это относительный путь. Он означает:
файл лежит в текущей рабочей папке, то есть там, откуда вы запускаете программу.
Абсолютный путь
Абсолютный путь указывает файл полностью (например, с диском на Windows).
Практическое правило для учебных проектов:
храните входные файлы рядом с main.py
запускайте программу из папки проектаpathlib для работы с путями
Модуль
pathlib помогает писать более переносимый код.
Документация:
pathlibИсключения: как Python сообщает об ошибках
Что такое исключение
Исключение — это объект, который Python “выбрасывает”, когда программа не может продолжать выполнение обычным образом.
Примеры типичных исключений:
ValueError — неверное значение (например, int("abc"))
FileNotFoundError — файл не найден
ZeroDivisionError — деление на ноль
KeyError — нет ключа в словаре при доступе через d[key]Документация:
Built-in Exceptionstry и except: ловим ошибки и продолжаем работу
Базовый шаблон
Идея:
код в try выполняется “как обычно”
если возникла ошибка, управление переходит в подходящий except!Понимание маршрута выполнения кода при ошибке и при её отсутствии
else и finally
Иногда удобно разделить “успешный сценарий” и “обязательные действия в конце”.
| Часть | Когда выполняется | Для чего нужна |
|---|---|---|
| else | если в try не было ошибок | логика успеха |
| finally | всегда (и при успехе, и при ошибке) | освобождение ресурсов, финальные действия |
Пример:
Что важно не делать
Не стоит писать “ловим всё” без причины:
Так можно скрыть реальные баги. Лучше ловить конкретные исключения, которые вы действительно ожидаете.
Как “поднимать” исключения самому: raise
Иногда вы хотите явно запретить неверные данные и сообщить об этом стандартным способом.
Здесь:
raise ValueError(...) создаёт и выбрасывает исключение
вызывающий код может поймать его через try/exceptФормат данных JSON: удобно для мини-проектов
Текстовые файлы часто хранят не “просто строки”, а структурированные данные. Один из самых популярных форматов —
JSON.
Модуль json позволяет:
json.dump записать Python-объект в файл
json.load прочитать из файла обратно в Python-объектПараметры:
ensure_ascii=False сохраняет кириллицу читаемо
indent=2 делает файл красивым для человекаДокументация:
jsonМини-проект: консольный трекер задач
Соберём небольшой проект, который объединяет:
функции и модули
списки и словари
работу с файлом
обработку исключенийПостановка задачи
Сделаем программу
todo, которая умеет:
добавлять задачу
показывать список задач
отмечать задачу выполненной
сохранять задачи в todo.jsonСтруктура хранения задач (в памяти) будет такой:
список tasks
каждый элемент — словарь с полями id, text, doneПример одного элемента:
{"id": 1, "text": "Купить молоко", "done": false}Архитектура проекта
Предложенная структура файлов:
main.py — точка входа и разбор команды пользователя
storage.py — загрузка и сохранение todo.json
todo.py — операции над задачами (добавить, вывести, завершить)Так вы практикуете разбиение кода на модули и не превращаете main.py в “простыню”.
Модуль storage.py
Что здесь происходит:
если файла нет, возвращаем пустой список
если файл битый или чтение невозможно, тоже возвращаем пустой список
сохранение всегда перезаписывает файл актуальным состояниемМодуль todo.py
main.py: интерфейс через простые команды
Команды сделаем максимально простыми, чтобы сфокусироваться на навыках, а не на сложном разборе аргументов.
add — добавить задачу
list — показать задачи
done — завершить по id
exit — выйтиЧто вы прокачали этим мини-проектом
Структуры данных: список словарей для хранения сущностей
Алгоритмические приёмы: поиск по списку, подсчёт следующего id
Модули: разнесение ответственности по файлам
Файлы: сохранение состояния между запусками
Исключения: защита от некорректного ввода пользователяТипичные ошибки и как их диагностировать
FileNotFoundError при чтении
Причина: файл отсутствует, а вы открываете в режиме "r".
Решение: проверяйте существование или создавайте файл заранее, или используйте логику “если нет, вернуть пустое”.UnicodeDecodeError
Причина: несовпадение кодировки.
Решение: явно указывать encoding="utf-8" и хранить файлы в UTF-8.json.JSONDecodeError
Причина: файл JSON повреждён или содержит не JSON.
Решение: ловить исключение и восстанавливать пустое состояние или делать резервную копию.Программа “не видит” файл
Причина: текущая рабочая папка не совпадает с папкой проекта.
Решение: запускать из папки проекта или использовать абсолютные пути, или pathlib с понятной базой.Что дальше
Теперь у вас есть полноценная база для прикладных задач: вы умеете принимать ввод, сохранять данные в файлы, обрабатывать ошибки и собирать небольшие программы из модулей.
Следующие логичные шаги практики:
тестирование функций (чтобы проверять логику без ручного ввода)
работа с более сложными форматами и источниками данных
усложнение архитектуры мини-проекта (например, команды через аргументы командной строки)