word_count.py
def count_words(filename):
❶ """Подсчет приблизительного количества строк в файле."""
try:
with open(filename,encoding='utf-8') as f:
contents = f.read()
except FileNotFoundError:
print(f"Sorry, the file {filename} does not exist.")
else:
words = contents.split()
num_words = len(words)
print(f"The file {filename} has about {num_words} words.")
filename = 'alice.txt'
count_words(filename)
Большая часть кода не изменилась. Мы просто снабдили код отступом и переме-
стили его в тело
count_words()
. При внесении изменений в программу желательно
обновлять комментарии, поэтому мы преобразовали комментарий в строку доку-
ментации и слегка переформулировали его
.
Теперь мы можем написать простой цикл для подсчета слов в любом тексте,
который нужно проанализировать. Для этого имена анализируемых файлов со-
храняются в списке, после чего для каждого файла в списке вызывается функция
count_words()
. Мы попробуем подсчитать слова в «Алисе в Стране чудес», «Сидд-
хартхе», «Моби Дике» и «Маленьких женщинах» — все эти книги распространя-
ются в свободном доступе. Я намеренно не стал копировать файл
siddhartha .txt
в каталог с программой
word_count .py
, чтобы выяснить, насколько хорошо наша
программа справляется с отсутствием файла:
Исключения
213
def count_words(filename):
...
filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt',
'little_women.txt']
for filename in filenames:
count_words(filename)
Отсутствие файла
siddhartha .txt
не влияет на выполнение программы:
The file alice.txt has about 29465 words.
Sorry, the file siddhartha.txt does not exist.
The file moby_dick.txt has about 215830 words.
The file little_women.txt has about 189079 words.
Использование блока
try
-
except
в данном примере предоставляет два важных
преимущества: программа ограждает пользователя от вывода трассировки и про-
должает выполнение, анализируя тексты, которые ей удается найти. Если бы в про-
грамме не перехватывалось исключение
FileNotFoundError
, инициированное из-за
отсутствия
siddhartha .txt
, то пользователь увидел бы полную трассировку, а работа
программы прервалась бы после попытки подсчитать слова в тексте «Сиддхартхи»;
до анализа «Моби Дика» или «Маленьких женщин» дело не дошло бы.
Ошибки без уведомления пользователя
В предыдущем примере мы сообщили пользователю о том, что один из файлов ока-
зался недоступен. Тем не менее вы не обязаны сообщать о каждом обнаруженном
исключении. Иногда при возникновении исключения программа должна просто
проигнорировать сбой и продолжать работу, словно ничего не произошло. Для
этого блок
try
пишется так же, как обычно, но в блоке
except
вы явно приказыва-
ете Python не предпринимать никаких особых действий в случае ошибки. В языке
Python существует команда
pass
, с которой блок ничего не делает:
def count_words(filename):
"""Подсчет приблизительного количества строк в файле."""
try:
...
except FileNotFoundError:
❶
pass
else:
...
filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:
count_words(filename)
Единственное отличие этого листинга от предыдущего — команда
pass
в точке
.
Теперь при возникновении ошибки
FileNotFoundError
выполняется код в блоке
except
, но при этом ничего не происходит. Программа не выдает данных трасси-
ровки и вообще никаких результатов, указывающих на возникновение ошибки.
214
Достарыңызбен бөлісу: |