210
Глава 10 •
Файлы и исключения
Заранее определяя вероятные источники ошибок, вы повышаете надежность своих
программ, которые продолжают работать даже при вводе некорректных данных
или при недоступности ресурсов. Ваш код оказывается защищенным от случайных
ошибок пользователей и сознательных атак.
Обработка
исключения FileNotFoundError
Одна из стандартных проблем при работе с файлами — отсутствие необходимых
файлов. Тот файл, который вам нужен, может находиться в другом месте, в имени
файла может быть допущена ошибка или файл может вообще не существовать.
Все эти ситуации достаточно прямолинейно обрабатываются в блоках
try
-
except
.
Попробуем прочитать данные из несуществующего файла. Следующая программа
пытается прочитать содержимое файла с текстом «Алисы в Стране чудес», но я не
сохранил файл
alice .txt
в одном
каталоге с файлом
alice .py
:
alice.py
filename = 'alice.txt'
with open(filename, encoding='utf-8') as f:
contents = f.read()
В программе видны два изменения. Во-первых, объект файла представляется пере-
менной с именем
f
— это общепринятое соглашение. Во-вторых, в программе ис-
пользуется аргумент
encoding
. Он необходим в тех случаях, когда кодировка вашей
системы по умолчанию не совпадает с кодировкой читаемого файла.
Прочитать данные из несуществующего файла нельзя, поэтому Python выдает
исключение:
Traceback (most recent call last):
File "alice.py", line 3, in
with open(filename, encoding='utf-8') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'alice.txt'
В последней строке трассировки упоминается
FileNotFoundError
: это исключение
выдается в том случае, если Python не может найти открываемый файл. В данном
примере функция
open()
порождает ошибку, и чтобы обработать ее, блок
try
на-
чинается перед строкой с вызовом
open()
:
filename = 'alice.txt'
try:
with open(filename, encoding='utf-8') as f:
contents = f.read()
except FileNotFoundError:
print(f"Sorry, the file {filename} does not exist.")
В этом примере код блока
try
выдает исключение
FileNotFoundError
, поэто-
му Python ищет блок
except
для этой ошибки. Затем выполняется код этого
Исключения
211
блока, в результате чего вместо трассировки выдается доступное сообщение об
ошибке:
Sorry, the file alice.txt does not exist.
Если файл не существует, программе больше делать нечего, поэтому код обработки
ошибок почти ничего не добавляет в эту программу. Доведем до ума этот пример и по-
смотрим, как обработка исключений помогает при работе с несколькими файлами.
Анализ
текста
Программа может анализировать текстовые файлы, содержащие целые книги.
Многие классические произведения, ставшие общественным достоянием, доступны
в виде простых текстовых файлов. Тексты, использованные в этом разделе, взяты
с сайта проекта «Гутенберг» (
http://gutenberg .org/
). На этом сайте хранится подборка
литературных произведений, не защищенных авторским правом; это превосходный
ресурс для разработчиков, которые собираются работать с литературными текстами
в своих программных проектах.
Прочитаем текст «Алисы в Стране чудес» и попробуем подсчитать количество слов
в тексте. Мы воспользуемся методом
split()
, предназначенным для построения
списка слов на основе строки. Вот как метод
split()
работает со строкой, содер-
жащей только название книги:
>>>
Достарыңызбен бөлісу: