Сохранение и чтение данных, сгенерированных пользователем
Сохранение с использованием модуля 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 + "!")
В точке (1) программа запрашивает имя пользователя для сохранения. Затем вызывается функция json.dump(), которой передается имя пользователя и объект файла; функция сохраняет имя пользователя в файле (2). Далее выводится сообщение о том, что имя пользователя было сохранено (3):
What is your name? Eric
We'll remember you when you come back, Eric!
А теперь напишем другую программу, которая приветствует пользователя по ранее сохраненному имени:
greet_user.py
import json
filename = 'username.json'
with open(filename) as f_obj:
(1) . .username = json.load(f_obj)
(2) . .print("Welcome back, " + username + "!")
В точке (1) вызов json.load() читает информацию из файла username.json в переменную username. После того как данные будут успешно прочитаны, мы можем поприветствовать пользователя по имени (2):
Welcome back, Eric!
Теперь эти две программы необходимо объединить в один файл. Когда пользователь запускает remember_me.py, программа должна взять имя пользователя из памяти, если это возможно; соответственно, программа начинается с блока try, который пытается прочитать имя пользователя. Если файл username.json не существует, блок except запросит имя пользователя и сохранит его в username.json на будущее:
remember_me.py
import json
# Программа загружает имя пользователя, если оно было сохранено ранее.
# В противном случае она запрашивает имя пользователя и сохраняет его.
filename = 'username.json'
try:
(1) . .with open(filename) as f_obj:
(2) . . . .username = json.load(f_obj)
(3)except FileNotFoundError:
(4) . .username = input("What is your name? ")
(5) . .with open(filename, 'w') as f_obj:
. . . .json.dump(username, f_obj)
. . . .print("We'll remember you when you come back, " + username + "!")
else:
. .print("Welcome back, " + username + "!")
Никакого нового кода здесь нет; просто блоки кода из двух предыдущих примеров были объединены в один файл. В точке (1) программа пытается открыть файл username.json. Если файл существует, программа читает имя пользователя в память (2) и выводит сообщение, приветствующее пользователя, в блоке else. Если программа запускается впервые, то файл username.json не существует, и происходит исключение FileNotFoundError (3). Python переходит к блоку except, в котором пользователю предлагается ввести имя (4). Затем программа вызывает json.dump() для сохранения имени пользователя и выводит приветствие (5).
Какой бы блок ни выполнялся, результатом является имя пользователя и соответствующее сообщение. При первом запуске программы результат выглядит так:
What is your name? Eric
We'll remember you when you come back, Eric!
Если же программа уже была выполнена хотя бы один раз, результат будет таким:
Welcome back, Eric!