10-9. Ошибки без уведомления: измените блок except из упражнения 10-8 так, чтобы при отсутствии файла программа продолжала работу, не уведомляя пользователя о проблеме.
10-10. Частые слова: зайдите на сайт проекта «Гутенберг» (http://gutenberg.org/) и найдите несколько книг для анализа. Загрузите текстовые файлы этих произведений или скопируйте текст из браузера в текстовый файл на вашем компьютере.
Для подсчета количества вхождений слова или выражения в строку можно воспользоваться методом count(). Например, следующий код подсчитывает количество вхождений ‘row’ в строке:
>>> line = "Row, row, row your boat"
>>> line.count('row')
2
>>> line.lower().count('row')
3
Обратите внимание: преобразование строки к нижнему регистру функцией lower() позволяет найти все вхождения искомого слова независимо от регистра.
Напишите программу, которая читает файлы из проекта «Гутенберг» и определяет количество вхождений слова ‘the’ в каждом тексте.
Сохранение данных
Многие ваши программы будут запрашивать у пользователя информацию. Например, пользователь может вводить настройки для компьютерной игры или данные для визуального представления. Чем бы ни занималась ваша программа, информация, введенная пользователем, будет сохраняться в структурах данных (таких, как списки или словари). Когда пользователь закрывает программу, введенную им информацию почти всегда следует сохранять на будущее. Простейший способ сохранения данных основан на использовании модуля json.
Модуль json обеспечивает запись простых структур данных Python в файл и загрузку данных из файла при следующем запуске программы. Модуль json также может использоваться для обмена данными между программами Python. Более того, формат данных JSON не привязан к Python, поэтому данные в этом формате можно передавать программам, написанным на многих других языках программирования. Это полезный и универсальный формат, который к тому же легко изучается.
примечание
Формат JSON (JavaScript Object Notation) был изначально разработан для JavaScript. Впрочем, с того времени он стал использоваться во многих языках, включая Python.
Функции json.dump() и json.load()
Напишем короткую программу для сохранения набора чисел и другую программу, которая будет читать эти числа обратно в память. Первая программа использует функцию json.dump(), а вторая — функцию json.load().
Функция json.dump() получает два аргумента: сохраняемые данные и объект файла, используемый для сохранения. В следующем примере json.dump() используется для сохранения списка чисел:
number_writer.py
import json
numbers = [2, 3, 5, 7, 11, 13]
(1) filename = 'numbers.json'
(2)with open(filename, 'w') as f_obj:
(3) . .json.dump(numbers, f_obj)
Программа импортирует модуль json и создает список чисел для работы. В точке (1) выбирается имя файла для хранения списка. Обычно для таких файлов принято использовать расширение .json, указывающее, что данные в файле хранятся в формате JSON. Затем файл открывается в режиме записи, чтобы модуль json мог записать в него данные (2). В точке (3) функция json.dump() используется для сохранения списка numbers в файле numbers.json.
Программа ничего не выводит, но давайте откроем файл numbers.json и посмотрим на его содержимое. Данные хранятся в формате, очень похожем на код Python:
[2, 3, 5, 7, 11, 13]
А теперь напишем следующую программу, которая использует json.load() для чтения списка обратно в память:
number_reader.py
import json
(1) filename = 'numbers.json'
(2)with open(filename) as f_obj:
(3) . .numbers = json.load(f_obj)
. .
print(numbers)
В точке (1) для чтения данных используется тот же файл, в который эти данные были записаны. На этот раз файл открывается в режиме чтения, потому что Python нужно только прочитать данные из файла (2). В точке (3) функция json.load() используется для загрузки информации из numbers.json; эта информация сохраняется в переменной numbers.
Наконец, программа выводит прочитанный список. Как видите, этот тот же список, который был создан в программе number_writer.py:
[2, 3, 5, 7, 11, 13]
Модуль json позволяет организовать простейший обмен данными между программами.
Сохранение и чтение данных, сгенерированных пользователем
Сохранение с использованием модуля json особенно полезно при работе с данными, сгенерированными пользователем, потому что без сохранения эта информация будет потеряна при остановке программы. В следующем примере программа запрашивает у пользователя имя при первом запуске программы и «вспоминает» его при повторных запусках.
Начнем с сохранения имени пользователя:
remember_me.py
import json
(1) username = input("What is your name? ")
filename = 'username.json'
with open(filename, 'w') as f_obj:
(2) . .json.dump(username, f_obj)
(3) . .print("We'll remember you when you come back, " + username + "!")