Работа с файлами и обработка исключений
Цели лекции
Что такое файл в контексте Python?
Путь к файлу
Путь к файлу: как не запутаться?
Вложенные try/except
Исключения как класс
Генерация исключений: оператор raise
Создание своего исключения
Комбинированный пример
Частые ошибки
Конец восьмой лекции
1.56M
Category: programmingprogramming

Лекция 8

1. Работа с файлами и обработка исключений

Курс:
«Технологии и методы
программирования»
Преподаватель:
доцент, к.т.н.,
Панфилова Ирина Евгеньевна

2. Цели лекции

01
Разобраться, как Python
работает с файлами на
уровне потоков
03
Понять устройство
исключений и принципы их
обработки в Python
02
Научиться открывать, читать и
записывать различные файлы
разными способами
04
Научиться писать
устойчивый код, который не
падает при ошибках вводавывода

3. Что такое файл в контексте Python?

— это ресурс операционной системы, представленный в программе в виде
файлового объекта, через который можно читать и записывать данные.
Файл – это поток
(stream)
Работа происходит с
файловым объектом
Файлы бывают
текстовыми и
бинарными
У файла есть
позиция (курсор)
Файл требует
управления
ресурсами
Ключевые особенности

4. Путь к файлу

Полный путь от корня диска
Windows
Абсолютный путь
Linux/Mac:
Путь вычисляется от текущей рабочей
директории (current working directory, CWD)
Относительный путь

5. Путь к файлу: как не запутаться?

Ошибка
Почему так нельзя
Правильно
"C:\new\data.txt"
\n → перенос строки;
escape-последовательности
"C:\\new\\data.txt
r"C:\new\data.txt"
"C:/temp/test/file.txt"
"folder" + "/" + "file.txt"
Ручная сборка путей ломает
переносимость
os.path.join("folder", "file.txt")
Path("folder") / "file.txt"
"./file.txt" при неизвестном CWD
Относительный путь зависит от
текущей директории запуска
Проверить через os.getcwd()
Path.cwd() / "file.txt"
Абсолютный путь для другой ОС
/home/user/file.txt на Windows не
существует
Нужен корректный путь для
системы
Path.home() / "file.txt"
open("folder")
Папка ≠ файл → IsADirectoryError
open("folder/data.txt")
Path("folder", "data.txt")
Для работы с путями лучше использовать os.path и особенно pathlib, потому что
они автоматически собирают корректные кроссплатформенные пути и избавляют от
ошибок, связанных со слэшами и escape.

6.

Открытие файла: функция open()
Функция open() создаёт файловый объект, через который Python
читает или записывает данные.
Синтаксис:
где:
• file — путь к файлу
• mode — режим работы (чтение/запись, текст/бинарный)
• encoding — кодировка (важно для текстовых файлов,
особенно utf-8)
open() возвращает объект типа TextIOWrapper (или
BufferedReader/Writer в бинарных режимах). Это не текст
файла, а объект и у него есть методы

7.

Режимы работы с файлами
Режим
Описание
Особенности
"r"
Читать текст
Ошибка, если файла нет
"w"
Перезаписать текст
Удаляет содержимое существующего файла
"a"
Добавление в конец
Не стирает старые данные
"x"
Создать новый файл
Ошибка, если файл уже существует
"r+"
Читать и писать
Не создаёт файл, работает только с
существующим
"w+"
Перезапись + чтение
Полная перезапись файла
"a+"
Чтение + добавление
Чтение с начала, запись в конец
"b"
Бинарный режим
Используется как добавка: "rb", "wb", "ab"
"t"
Текстовый режим (по умолч.)
Используется редко: "rt", "wt"

8.

Чтение файла
#1
read() — прочитать
весь файл целиком
#2
readline() —
прочитать одну
строку
#3
readlines() — прочитать
все строки как список

9.

Запись в файл
#1
Режим "w" — запись с
перезаписью (метод
write() принимает
строку, а не числа
и не списки)
#2
Режим "a" —
добавление в конец
#
Полезный пример:
запись списка строк

10.

Закрытие файла
Когда Python открывает файл через open(), ОС выделяет:
файловый дескриптор — системный ресурс,
буфер — область памяти, куда записываются данные
перед сохранением на диск.
1. Открыть файл
f = open(...)
Если файл не закрыть:
данные могут так и не записаться (буфер не сброшен),
ресурс останется занят,
файл может быть заблокирован для других программ,
в больших циклах можно “исчерпать” доступные
дескрипторы.
2. Выполнить
операции
f.read(), f.write()
3. Закрыть файл
f.close()

11.

Контекстный менеджер with
with open() — это безопасный и удобный способ работы с файлами.
Он автоматически закрывает файл, даже если внутри блока произойдёт
ошибка:
Не нужно вызывать close() вручную
Файл гарантированно закроется при любых обстоятельствах
Уменьшается количество ошибок
Код чище и проще читать
Реже возникают проблемы с утечками ресурсов
Если внутри блока случится
исключение, то файл всё
равно будет закрыт.

12.

Текстовые и бинарные файлы
text mode
данные читаются как строки (str)
используется кодировка (encoding="utf-8")
символы \n, \t и т.д. интерпретируются
автоматически
удобны для работы с:.txt, .csv, .json, .xml, .html
binary mode
данные читаются как байты (bytes)
нет кодировки (это «сырые» данные)
важно для: изображений, аудио, архивов, .exe,
машинного кода

13.

Кодировка файлов
Кодировка определяет как символы текста представлены в виде байтов в файле.
Она нужна при:
• чтении текстовых файлов → чтобы правильно “расшифровать” байты
• записи текстовых файлов → чтобы корректно “закодировать” строки
Python по умолчанию использует кодировку ОС, а не всегда UTF-8.
Кодировка
Где применяется
UTF-8
стандарт в Python, Linux, macOS, веб
Windows-1251
старые русские файлы под Windows
KOI8-R
очень старые Unix-системы
ASCII
минимальная базовая кодировка

14.

JSON
JSON (JavaScript Object Notation) — это текстовый
формат представления данных, основанный на
структурах
“ключ → значение”.

15.

Что такое
сериализация?
— это процесс преобразования
объекта Python (словаря, списка,
набора данных) в формат,
который можно сохранить в
файл или передать по сети.
Обратный процесс называется
десериализация.
Формат
Тип
Для чего нужен
Чем сериализуется
JSON
текст
хранение простых
данных, обмен через API
json.dump, json.dumps
CSV
текст
табличные данные
csv.writer, csv.reader
Pickle
бинарный
сохранение Pythonобъектов как есть
pickle.dump,
pickle.dumps
Custom
текст/байты
собственный формат
ручная сериализация

16.

Pickle —
бинарная
сериализация
pickle — это встроенный модуль Python,
который позволяет сохранять
(сериализовать) и загружать
(десериализовать) любые Pythonобъекты в бинарном формате. В отличие
от JSON, Pickle может сохранять:
списки, словари
множества и кортежи
Функции
экземпляры классов
почти любые сложные структуры
Python
Пример сериализации

17.

Что такое исключение?
— это событие, которое возникает во время
выполнения программы и нарушает её нормальный
ход работы. Исключения появляются в ситуациях,
когда программа не может выполнить операцию:
попытка открыть несуществующий файл
деление на ноль
обращение к несуществующему элементу списка
неправильный тип данных
ошибка в синтаксисе (на этапе выполнения —
SyntaxError)
• проблемы с сетью, файловой системой, доступами

18.

try/except — основа обработки
Запускает код, где возможно
возникновение исключения. Если
ошибка появилась → переход в except.
Срабатывает, только если в try возникло
исключение.
Выполняется только если ошибок НЕ было.
Используется для кода, который должен
запускаться только при успехе, а не при
ошибке.
Выполняется всегда: была ошибка, не
было ошибки, был return, был break.
Используется для освобождения
ресурсов: закрытия файлов, сетевых
соединений, БД.

19.

1
2
4
5
3
Варианты except и
множественные
except

20.

Обработка пользовательского ввода
Пользователь может ввести что угодно:
текст вместо числа пустую строку пробелы неправильный формат символы, которые нельзя преобразовать Если не проверять ввод → программа
упадёт с ValueError

21. Вложенные try/except

Иногда разные части одного фрагмента
кода могут генерировать разные ошибки, и
их нужно обрабатывать по-разному.
Вложенные try/except помогают точечно
обрабатывать ошибки там, где они
возникают.
Но использовать их нужно аккуратно —
иначе код становится трудночитаемым.

22. Исключения как класс

В Python каждое исключение —
это объект, созданный на основе
специального класса исключений.
Все встроенные ошибки
(ValueError, TypeError,
FileNotFoundError…) — это классы,
унаследованные от BaseException
→ Exception.

23. Генерация исключений: оператор raise

Зачем?
raise — это оператор, который
принудительно выбрасывает
исключение. Используется,
когда программа сталкивается с
недопустимой ситуацией, которую
должен обработать вызывающий
код.
1.
защита инвариантов (условий)
программы
2. валидация аргументов функций
3. остановка выполнения при ошибке
4. улучшение читаемости и
надёжности
5. лучшее управление логикой

24. Создание своего исключения

чтобы код был самодокументируемым
чтобы отделять ошибки программы от
системных ошибок
чтобы ловить только специфические
проблемы
✔ отражает логику предметной области
✔ сообщение становится более точным
✔ исключение можно ловить отдельно:
чтобы предоставить пользователю
точное объяснение
чтобы создавать иерархию ошибок проекта

25. Комбинированный пример

1. Во внешнем try мы пытаемся
открыть файл — если его нет,
срабатывает except
FileNotFoundError.
2. Если файл успешно открыт,
следующий вложенный try проверяет
корректность данных внутри:
попытка преобразовать содержимое
в число может вызвать ValueError.
3. Блок else выполняется только
тогда, когда ошибок нет, а в finally
помещается код, который должен
выполниться в любом случае.

26. Частые ошибки

Ошибка
Почему происходит
Как правильно
Забыли закрыть файл (f.close())
Ручное управление ресурсами, файл
остаётся открытым
Использовать with open(...)
Неверный путь к файлу
Слеши, относительные пути, пробелы,
кириллица
Использовать os.path, pathlib, проверять
путь
Пытаются читать файл, которого нет
Файл не создан/не там
Ловить FileNotFoundError
Пытаются преобразовать ввод в число
без проверки
Любой ввод может быть некорректным
try/except ValueError
Ловят все ошибки через except:
Прячет реальные ошибки, сложнее
отладка
Ловить конкретные исключения
Перехватывают исключение, но ничего не
Ошибка замалчивается
делают
Всегда давать сообщение или логировать
Используют raise без сообщения
Пользователь не понимает, что
произошло
raise ValueError("Сообщение")
Создают свои исключения не наследуясь
от Exception
Исключение ведёт себя некорректно
class MyError(Exception): pass
Путают JSON и Python-объекты
Думают, что JSON = dict
Использовать json.load(), json.dump()
Записывают «нестроки» в файл через
write()
write() принимает только строки
f.write(str(value))
Не используют finally, когда он нужен
Ресурсы не освобождаются
Размещать очистку/закрытие в finally

27. Конец восьмой лекции

English     Русский Rules