Сейчас нам с вами предстоит большая работа по анализу текстового файла, по работе с текстовым файлом. Мы должны будем на реальном примере суметь сделать что-то полезное, а именно, мы будем с вами анализировать повесть Пушкина "Капитанская дочка" с точки зрения употреблений каждого слова. Мы захотим посмотреть, какие слова употребляются в этой повести чаще других, и можно ли на основе этого сделать какой-то вывод. План действий у нас следующий: сначала мы должны считать текст из файла, потом составить словарь всех слов, скоро узнаете, что это, что под этим подразумевается, потом отсортировать этот словарь, потом удалить стоп-слова, тоже скоро поймете, о чем это, и сохранить результаты в файл. Начнем с чтения текста. Давайте посмотрим, у нас в папке лежит файл, который называется "dochka.txt". Если мы его откроем, то увидим здесь повесть Пушкина "Капитанская дочка" целиком. Понятно, что руками здесь обработать было бы невозможно, поэтому мы используем компьютер. Мы хотим считать этот файл. Код у нас остался от предыдущей работы. Здесь можно его под нас немножечко поправить. Мы будем хранить все в переменной "text", тут все по-старому. Хотим открыть файл "dochka.txt", как infile, для всех строк будем прибавлять каждую строчку к нашему тексту и хотим распечатать. Но тут у нас же очень большая повесть, мы не хотим ее видеть целиком сейчас на экране, нам главное убедиться, что считалось правильно. Для этого мы возьмем и посмотрим только на начало этого большого текста, то есть на первые 100 символов текста. Давайте посмотрим, что у нас получится. Давайте проанализируем ошибку по-честному. Вот у нас вышла какая-то ошибка. Не можем декодировать. Видим, что ошибка с кодировкой. Возможно, если мы сейчас добавим кодировку, укажем — все сработает. Давайте проверим. Получилось. Видели? Ошибка с кодировкой решается тем, что мы в явном виде указываем кодировку. И тут смотрите какой момент: обязательно написать, что это encoding равно UTF-8. Когда мы писали режим, режимы могли писать, не используя, не указывая, что это именно mode. Почему? Потому что второй аргумент — это режим, а кодировка ожидается в виде третьего аргумента. Если бы мы передали вот так, с кавычкой, все равно была бы ошибка, потому что как будто бы это режим. Режима такого нет, такая есть только кодировка, поэтому здесь важно указать полностью. И вот мы смогли считать текст. Отлично! А теперь мы должны разбить этот текст на слова, мы же хотим составлять словарь слов. Поэтому давайте попробуем разбить текст на слова. Разобьем сначала просто по пробелам. Будет у нас список, который называется "almost_words", "почти-слова". Сейчас увидим. "Almost_words" — это текст, который разбит по пробелам. Посмотрим, что получится. Пусть у нас будет "almost_words", например, на первые 10 слов посмотрим. Сделаем "print" первых 10 слов. Запускаем. Видим, что у нас есть, во-первых, какие-то пустые слова, потому что там был пробел. Во-вторых, видим, что точка приклеивается к какому-то слову, то есть здесь это все-таки еще "почти-слова", не совсем слова. А мы хотим, чтобы это были прям настоящие слова. Для этого мы попробуем преобразовать все, что получилось. Опять же, есть разные способы. Воспользуемся одним из них. Будет у нас список просто слов. Создадим сначала пустой список. Теперь для всех "почти-слов" в нашем списке "almost_words", "for" (для каждого "почти-слова" в списке "почти-слов" что мы сделаем?) мы, во-первых, хотим записать слово маленькими буквами, потому что потом мы будем считать все слова, и нам не важно, слово "пословица", например, написано с большой буквы или с маленькой. Это все равно нужно посчитать, как одно и то же слово, поэтому, во-первых, мы хотим "almost_word" записать маленькими буквами (".lower"), а кроме того, хотим избавиться от всех странных символов по краям. Напишем "strip", чтобы удалить все лишнее. А что у нас может быть лишнего? Может быть точка, может быть запятая, скобки, все что угодно, и нам бы хотелось, чтобы этого не было, чтобы они не приклеивались. Убрали. Давайте все-таки присвоим что-то. "Слово" у нас теперь равно. Новая переменная "слово" — это "почти-слово", которое записали маленькими буквами и удалили по краям все знаки препинания. Но посмотрите, если мы применим, например, к первому же слову, оно получилось пустым даже в самом начале. Или, если бы мы применили к какому-нибудь одиноко стоящему тире, у которого было с двух сторон по пробелу. Если мы применяем эту функцию, то пробелы исчезают, тире исчезает. Итого, получается, что у нас слово стало вообще пустым. Нам не нужны пустые слова, пустые строчки. Поэтому только в случае, если у нас получился не пустой элемент, если слово "word" не пустое, только в этом случае мы добавляем его к списку всех слов, "words.append" наше слово "word". И посмотрим, что получилось. Давайте распечатаем первые несколько слов. Запускаем. Смотрите, пустые ушли, все слова теперь написаны с маленькой буквы. Никаких приклеенных знаков препинания больше нет. Итого, мы из списка "почти-слов" сделали просто список слов. Это уже хорошо.