今天是2020年2月23日,多云,8~13℃
目前很多程序都需要用户提供信息,并在程序关闭时仍为用户储存信息。JSON格式文件原本是为 JavaScript 开发的,但现在已经成为一种常见格式。json 模块能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。
一、数据储存与读取
使用 json 模块中的 dump 函数和 load 函数,可以实现数据的储存与读取。
1、dump函数
先写一个使用 dump 函数储存数据的程序。
import json
numbers = [1,1,2,3,5,8,13,21,34,55]
filename = "fbnq.json"
with open(filename,'w') as f_obj:
json.dump(numbers,f_obj)
打开目录下的 fbnq.json,发现内容与程序内的numbers相同,包括方括号与逗号。
2、load函数
现在写一个使用 load 函数读取数据的程序。
import json
filename = "fbnq.json"
try:
with open(filename) as f_obj:
numbers = json.load(f_obj)
except FileNotFoundError:
pass
else:
print(numbers) #Output:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
print(type(numbers)) #Output:<class 'list'>
存储在 .json 文件中的数据被成功读取,并且是以列表形式被读取。
二、应用try-except-else代码块
利用异常中学习的 try-except-else 代码块,可以在同一个程序中实现储存与读取。
import json
filename = "name.json"
try:
with open(filename) as f_obj:
name = json.load(f_obj)
except FileNotFoundError:
name = input("What's your name!")
with open(filename,'w') as f_obj:
json.dump(name,f_obj)
print("Nice to meet you, " + name + " ! We'll remember you!")
else:
print("Welcome back, " + name + "!")
while True:
choice = input("Do you want to change your name?")
if choice.lower() == 'yes':
name = input("What's your name?")
with open(filename,'w') as f_obj:
json.dump(name,f_obj)
print("You've successfully changed your name!")
break
elif choice.lower() == 'no':
print("OK. Goodbye, " + name + "!")
break
else:
print("Please Enter yes or no!")
'''
Test1:
What's your name!Alex
Nice to meet you, Alex ! We'll remember you!
Test2:
Welcome back, Alex!
Do you want to change your name?yes
What's your name?Micheal
You've successfully changed your name!
Test3:
Welcome back, Micheal!
Do you want to change your name?no
OK. Goodbye, Micheal!
'''
三、重构
上面的程序虽然能正确运行,但可以通过使用函数将各个部分拆分,能够将程序变得更加整洁。
import json
def save_new_name(filename):
'''获取并储存新名字'''
name = input("What's your name?")
with open(filename,'w') as f_obj:
json.dump(name,f_obj)
print("Your name has been saved!")
def get_saved_name(filename):
'''若文件存在则返回名字,否则返回False'''
try:
with open(filename) as f_obj:
name = json.load(f_obj)
except FileNotFoundError:
return False
else:
return name
def ask_change_name(name,filename):
'''输入yes修改名字,输入no退出告别,其它输入重复询问'''
while True:
choice = input("Do you want to change your name?")
if choice.lower() == 'yes':
save_new_name(filename)
break
elif choice.lower() == 'no':
print("OK. Goodbye, " + name + "!")
break
else:
print("Please Enter Yes or No!")
def greet_user():
'''与用户交互'''
filename = "name.json"
name = get_saved_name(filename)
if not name:
save_new_name(filename)
else:
print("Welcome back, " + name + "!")
ask_change_name(name,filename)
#主程序
greet_user()