10.4存储数据
一般python会把用户输入的数据存储在列表或字典里。当关闭程序后这些数据也会消除。json模块可以把这些数据转存到文件里,json格式的文件也可以供其他语言的程序使用。
10.4.1 json.dump()和json.load()
我们先用json.dump()来存储数据,这个函数接受俩实参,分别是需要存储的数据结构和可用于存储的文件对象。
import json
#导入json模块
numbers = ['1','2','3']
#创建需要存储的数据
filename = 'test\\numbers.json'
#指定存储的文件,json文件的后缀是.json
with open(filename,'w') as f_obj:
#以写入模式打开文件
json.dump(numbers,f_obj)
#使用json.dump()将numbers列表存进numbers.json文件
使用json.load()将文件数据读取到内存。
import json
filename = 'test\\numbers.json'
with open(filename) as f_obj:
#用读取模式打开文件
num = json.load(f_obj)
#json.load()加载存储在文件里的数据
#再将数据从进变量num
print(num)
>>>['1', '2', '3']
10.4.2 保存和读取用户生成的数据
首先编写一个保存用户输入的数据。
import json
#导入模块
username = input('what is your name: ')
#提示用户输入
filename = 'test\\username.json'
#指定存储文件
with open(filename,'w') as f_obj:
#用写入模式打开文件
json.dump(username,f_obj)
#用json.dump()把用户的输入存进json文件
print('We will remember you when you come back ' +username+ '!')
#提示已存储用户名
>>>what is your name: haha
We will remember you when you come back haha!
再编写一个读取文件载入数据的程序。
import json
filename = 'test\\username.json'
with open(filename) as f_obj:
#用只读模式打开文件
username = json.load(f_obj)
#用json.load()读取文件里的用户名把它存到变量里
print('Welcome back ' +username+ '!')
#欢迎用户回归,用户名已恢复
>>>Welcome back haha!
接下来用try-except-else代码块把两个程序结合起来。在文件里找到用户名,提示欢迎回归,如果没找到文件就让用户输入用户名,提示已存好用户名。
remember_me.py
import json
filename = 'test\\username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
username = input('what is your name: ')
with open(filename,'w') as f_obj:
json.dump(username,f_obj)
print('We will remember you when you come back ' +username+ '!')
else:
print('Welcome back ' +username+ '!')
>>>Welcome back haha!
10.4.3 重构
重构:把代码划分为一系列具体工作的函数。
重构remember_me.py第一步,首先把它放到函数里。
import json
def greet_user():#创建函数,注意缩进
"""问候用户"""
filename = 'test\\username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
username = input('what is your name: ')
with open(filename,'w') as f_obj:
json.dump(username,f_obj)
print('We will remember you when you come back ' +username+ '!')
else:
print('Welcome back ' +username+ '!')
greet_user()#改动行标注
>>>Welcome back haha!
多行缩进选中,再按tab键或者CTRL+】。取消多行缩进,选中然后CTRL+【。
重构 greet_user(),分离出从文件获取用户名的代码。
import json
def get_stored_user():
"""获取存储用户名"""
filename = 'test\\username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
#上面几行为原greet_user函数里的用户名获取的功能代码
return None
#报错返回None
else:
#若成功执行则函数返回用户名
return username
def greet_user():
"""问候用户"""
username = get_stored_user()
#从get_stored_user()函数的返回值获取用户名
if username:
#如果存在用户名则问候用户
print('Welcome back ' +username+ '!')
else:#否则提示用户输入用户名并存储
username = input('what is your name: ')
with open(filename,'w') as f_obj:
json.dump(username,f_obj)
print('We will remember you when you come back ' +username+ '!')
greet_user()
>>>Welcome back haha!
将非预期返回值设为None有利于我们对代码进行简单测试。
继续重构greet_user(),分离提示新用户输入的功能。
import json
def get_stored_user():
"""获取存储用户名"""
filename = 'test\\username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
return None
else:
return username
def get_new_user():
"""提示用户输入"""
username = input('what is your name: ')
filename = 'test\\username.json'
with open(filename,'w') as f_obj:
json.dump(username,f_obj)
#以上为greet_user()中的提示用户输入源代码
return username
#函数返回用户输入的用户名
def greet_user():
"""问候用户"""
username = get_stored_user()
if username:
print('Welcome back ' +username+ '!')
else:
username = get_new_user()
#从get_new_user()的返回值获取用户名
print('We will remember you when you come back ' +username+ '!')
greet_user()
10-11
import json
num = input('enter a number of your love:')
with open('test\\numbers.json ','w') as f_obj:
json.dump(num,f_obj)
>>>enter a number of your love:12
import json
filename = 'test\\numbers.json'
with open(filename) as f_obj:
num = f_obj.read()
print('I know your favorite number! It is :' +num+ '.')
>>>I know your favorite number! It is :"12".
10-12
import json
filename = 'test\\numbers.json'
try:
with open(filename) as f_obj:
num = f_obj.read()
except FileNotFoundError:
num = input('enter a number of your love:')
with open('test\\numbers.json ','w') as f_obj:
json.dump(num,f_obj)
print('I know your favorite number! It is :' +num+ '.')
>>>enter a number of your love:13
I know your favorite number! It is :13.
10-12
import json
def get_stored_user():
"""获取存储用户名"""
filename = 'test\\username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
return None
else:
return username
def get_new_user():
"""提示用户输入"""
username = input('what is your name: ')
filename = 'test\\username.json'
with open(filename,'a') as f_obj:
json.dump(username,f_obj)
return username
def greet_user():
"""问候用户"""
username = get_stored_user()
answer = input("Are you " +username+ " ?(y/n):")
if answer.lower() == 'y':
print('Welcome back ' +username+ '!')
else:
username = get_new_user()
print('We will remember you when you come back ' +username+ '!')
greet_user()
>>>Are you haha ?(y/n):n
what is your name: hehe
We will remember you when you come back hehe!