10-4 存储数据

# -*- coding:utf-8 -*-
#li hongliang 2020年08月21日
#10.4 存储数据
#很多程序都要求用户输入某种信息,如让用户存储游戏首选项或提供要可视化的数据。不管专注的是什么,程序都把用户提供的信息存储在列表和字典等数据结构中。用户关闭程序时,你几乎总是要保存他们提供的信息;一种简单的方式是使用模块json来存储数据。模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。你还可以使用json在Python程序之间分享数据。更重要的是,JSON数据格式并非Python专用的,这让你能够将以JSON格式存储的数据与使用其他编程语言的人分享。这是一种轻便格式,很有用,也易于学习。
#注意 JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用。

#10.4.1 使用json.dump()和json.load()
#我们来编写一个存储一组数字的简短程序,再编写一个将这些数字读取到内存中的程序。第
#一个程序将使用json.dump()来存储这组数字,而第二个程序将使用json.load()。
#函数json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象

#10.4.2 保存和读取用户生成的数据
#对于用户生成的数据,使用json保存它们大有裨益,因为如果不以某种方式进行存储,等程序停止运行时用户的信息将丢失

#10.4.3 重构
#你经常会遇到这样的情况:代码能够正确地运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数。这样的过程被称为重构。重构让代码更清晰、更易于理解、更容易扩展。

            #动手试一试
#10-11 喜欢的数字:编写一个程序,提示用户输入他喜欢的数字,并使用
#json.dump()将这个数字存储到文件中。再编写一个程序,从文件中读取这个值,并打
#印消息“I know your favorite number! It’s _____.”。
import json
number = input("What's your favorite number ? ")
filename = 'number.json'
with open(filename,'w') as f_obj:
    json.dump(number,f_obj)   

filename = 'number.json'
with open(filename) as f_obj:
    number= json.load(f_obj)
print("I know your favorite number! It’s "+ number + " .")

#10-12 记住喜欢的数字:将练习10-11 中的两个程序合而为一。如果存储了用户喜
#欢的数字,就向用户显示它,否则提示用户输入他喜欢的数字并将其存储到文件中。运
#行这个程序两次,看看它是否像预期的那样工作。
import jsons
filename = 'number.json'
try:
    with open(filename) as f_obj:
        number= json.load(f_obj)
except FileNotFoundError:
    number = input("What's your favorite number ? ")
    with open(filename,'w') as f_obj:
        json.dump(number,f_obj)
        print("Your favorite number is " + number)
else:
    print("I know your favorite number! It’s "+ number + " .")

#10-13 验证用户:最后一个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()
    if username:
        ask=input("Is the name "+username+" right?(y/n)")
        if ask=='y':
	        print("Welcome back,"+username+" !")
        else:
            username=get_new_username()
            print("We'll remember you,"+username+" !")
    else:   #这里的else其实已没有实际意义,可有可无
        username = get_new_username()
        print("We'll remember you when you come back, " + username + "!")
greet_user()

#10.5 小结
#在本章中,你学习了:如何使用文件;如何一次性读取整个文件,以及如何以每次一行的方式读取文件的内容;如何写入文件,以及如何将文本附加到文件末尾;什么是异常以及如何处理程序可能引发的异常;如何存储Python数据结构,以保存用户提供的信息,避免用户每次运行程序时都需要重新提供。在第11章中,你将学习高效的代码测试方式,这可帮助你确定代码正确无误,以及发现扩展现有程序时可能引入的bug。







你可能感兴趣的:(python学习)