python入门_day10_Chap10_存储数据

10.4 存储数据

很多程序都要求用户输入某种信息,如让用户存储游戏首选项或提供要可视化的数据。不管专注的是什么,程序都把用户提供的信息存储在列表和字典等数据结构中。用户关闭程序时,你几乎总是要保存他们提供的信息;一种简单的方式是使用模块json 来存储数据。

模块json 让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。

:JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用

1.json,dump()和json.load()

#先导入模块json 
import json
numbers=[2,4,6,8,7,10,13]
#常使用文件扩展名.json来指出文件存储的数据为JSON格式
filename='numbers.json'
with open(filename,'w')as f_obj:
    #使用函数json.dump() 将数字列表存储到文件numbers.json中。 
    json.dump(numbers,f_obj)

运行结果:
我们可以打开文件numbers.json。
在这里插入图片描述

使用json.load()将这个列表读取到内存中

import json
numbers=[2,4,6,8,7,10,13]

filename='numbers.json'
#以读取的方式打开这个文件
with open(filename)as f_obj:
   #使用函数json.load() 加载存储在 numbers.json中的信息,并将其存储到变量numbers 中
    numbers=json.load(f_obj)

print(numbers)

2.保护和读取用户生成的数据
对于用户生成的数据,使用json 保存它们。例如,用户首次运行程序时 被提示输入自己的名字,这样再次运行程序时就记住他了。

rememberme.py

import json

username=input("What is your name?")
filename='username.json'
with open(filename,'w')as f_obj:
    #调用json.dump() ,并将用户名和一个文件对象传递给它,从而将用户名存储到文件中
    json.dump(username,f_obj)
    print("We'll remember you when you come back "+username+"!")
     

greetus.py

import json
filename='username.json'

with open(filename)as f_obj:
    username=json.load(f_obj)
    print("Welcome back,"+username+"!")

运行结果:
在这里插入图片描述

我们需要将这两个程序合并到一个程序(remember_me.py)中。
这个程序运行时,我们将尝试从文件username.json中获取用户名,因此我们首先编写一个尝试恢复用户名的try 代 码块。
如果这个文件不存在,我们就在except 代码块中提示用户输入用户名,并将其存储在username.json中,以便程序再次运行时能够获取它:

import json

#如果以前存储了用户名,就加载他
#否则,就提示用户输入用户名并存储他

filename='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'll remember you when u come back, "+username+'!')
else:
    print("Welcome back, "+username)

3.重构

代码能够正确地运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数。这样的过程被称为重构 。

要重构remember_me.py,可将其大部分逻辑放到一个或多个函数中。remember_me.py的重点是问候用户,因此我们将其所有代码都放到一个名为greet_user() 的函数中:

import json

def greet_user():
    """问候用户,并指出其名字"""
    filename='username.json'
    try:
        with open(filename)as f_obj:
            username=json.load(f_obj)
    except FileNotFoundError:
        username=input("What's your name?")
        with open(filename,'w')as f_obj:
            json.dump(username,f_obj)
            print("We'll remember you when u come back.")
    else:
        print("Welcome back,"+username+"!")

greet_user()

函数greet_user() 所做的不仅仅是问候用 户,还在存储了用户名时获取它,而在没有存储用户名时提示用户输入一个。

下面来重构greet_user() ,让它不执行这么多任务:

新增的函数get_stored_username() 目标明确,如果存储了用户名,这个函数就获取并返回它;如果文件username.json不存在,这个函数 就返回None 。

import json


def get_stored_username():
    filename='username.json'
    try:
        with open(filename)as f_obj:
            username=json.load(f_obj)
    except FileNotFoundError:
        return None
    else:
       return username
    

def greet_user():
    """问候用户,并指出其名字"""
    username=get_stored_username()
    if username:
        print("Welcome back,"+username+"!")
    else:
        username=input("What's your name?")
        with open(filename,'w')as f_obj:
            json.dump(username,f_obj)
            print("We'll remember you when u come back.")
    

greet_user()

我们还需将greet_user() 中的另一个代码块提取出来:
将没有存储用户名时提示用户输入的代码放在一个独立的函数中

import json


def get_stored_username():
    filename='username.json'
    try:
        with open(filename)as f_obj:
            username=json.load(f_obj)
    except FileNotFoundError:
        return None
    else:
       return username
    

def get_new_username():
    #提示用户输入用户名
    username=input("What is your name?")
    filename='username.json'
    with open(filename,'w')as f_obj:
        json.dump(username,f_obj)
    return username

def greet_user():
    """问候用户,并指出其名字"""
    username=get_stored_username()
    if username:
        print("Welcome back,"+username+"!")
    else:
        username=get_new_username()
        print("We'll remember you when u come back.")
    

greet_user()

练习
1 . 喜欢的数字 :编写一个程序,提示用户输入他喜欢的数字,并使用json.dump() 将这个数字存储到文件中。再编写一个程序,从文件中读取这个值,并打印 消息“I know your favorite number! It’s _____.”。

import json
filename='favorite_number.json'

with open(filename,'w')as f_obj:
    num=input("enter your favorite number:")
    json.dump(num,f_obj)

with open(filename)as f_obj:
    nums=json.load(f_obj)
    print("I know ur favorite number is "+nums)

运行结果:
在这里插入图片描述

2.记住喜欢的数字 :将练习1中的两个程序合而为一。如果存储了用户喜欢的数字,就向用户显示它,否则提示用户输入他喜欢的数字并将其存储到文件中。 运行这个程序两次,看看它是否像预期的那样工作。

import json

filename='favorite_number.json'
try:
    with open(filename)as f_obj:
        num=json.load(f_obj)
except FileNotFoundError:
    num=input("enter your favorite number:")
    with open(filename,'w')as f_obj:
        json.dump(num,f_obj)
        print("we remember ur number:"+num)
else:
    print("I know ur favorite number is "+num)
    

在这里插入图片描述

3.验证用户 :最后一个remember_me.py版本假设用户要么已输入其用户名,要么是首次运行该程序。我们应修改这个程序,以应对这样的情形:当前和最后一次 运行该程序的用户并非同一个人。
为此,在greet_user() 中打印欢迎用户回来的消息前,先询问他用户名是否是对的。如果不对,就调用get_new_username() 让用户输入正确的用户名。

import json


def get_stored_username():
    filename='username.json'
    try:
        with open(filename)as f_obj:
            username=json.load(f_obj)
    except FileNotFoundError:
        return None
    else:
       return username
    

def get_new_username():
    #提示用户输入用户名
    username=input("What is your name?")
    filename='username.json'
    with open(filename,'w')as f_obj:
        json.dump(username,f_obj)
    return username

def greet_user():
    """问候用户,并指出其名字"""
    username=get_stored_username()
    flag=input("Is your name "+username+" rigt?(Yes/No)")
    if flag=='Yes':
        print("Welcome back,"+username+"!")
    else:
        username=get_new_username()
        print("We'll remember you when u come back,"+username+"!")
    

greet_user()

运行结果:
在这里插入图片描述

小结
我们在第十章学习了:
如何使用文件,如何一次性读取整个文件,以及如何以每次一行的方式读取文件的内容;
如何写入文件,以及如何将文本附加到文件末尾;
什么是异常以 及如何处理程序可能引发的异常;
如何存储Python数据结构,以保存用户提供的信息,避免用户每次运行程序时都需要重新提供。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值