MyPython-->进阶篇-->存储数据json

存储数据

程序要将用户提供的信息储存在列表和字典等数据结构中。用户关闭程序时,你几乎总是要保存他们的信息 一种简单的方式是使用模块json来存储数据

模块json能将简单的python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。还可以使用json在python程序之间分享数据,更重要的是,json数据格式并非python专用,这让你能够将以json格式储存的数据与其他编程语言的人分享。

Json 格式最初是由JavaScript开发的,但随后成了一种常见的格式

使用json.dump()和json.load()

我们来编写一个存储一组数字的简短程序,再编写一个将这些数字读取到内存中的程序,第一个程序使用json.dump()来储存这组数字,第二个程序将使用json.load()

函数json.dump()接受两个实参:要储存的数据以及可以用于存储数据的文件对象。下面是演示

import json
number = [1,2,3,5]
file_name = 'number.json' #通过扩展名指纹文件存储的数据为json格式
with open(file_name,'w') as file_object:
    json.dump(number,file_object)

我们先导入json模块,再创建一个是数字列表,我们指定存放在number.json里,文件后缀是.json来指出文件存储的数据是json格式,我们再以写入模式打开文件,让json能见数据写入其中使用json.dup()将数据写入,我们没有写输出语句,打开这个文件查看,数据存储的格式与python一样

注意json.dump()方法,传递两个参数 第一个要写入的,第二个要存储的位置

再写一个程序,使用json.load()读取到内存中

with open(filename,'r') as file_object:
    contents = json.load(file_object)
print(contents)

这是在程序间共享数据的简单方式

保存和读取用户生成的数据

对于用户输入的数据,用json来保存大有裨益,因为如果不以某种方式进行存储,等程序停止运行时用户的信息将丢失。 看一个例子

用户首次运行程序时被提示输入自己的名字,再次运行程序时就记住他了

我们先储存名字

ipt = input('enter your name')
filename1 = 'name.json'
with open(filename1,'w') as file_object:
    json.dump(ipt, file_object)

再读取之前存储的名字

with open(filename1,'r') as file_object:
    name_ipt = json.load(file_object)
print('wleccome %s'%name_ipt)

我们将这两个程序合并到一个内,在执行的时候先去name.json尝试获得用户名,如果没有这文件,用try-except处理这个错误,并入用户输入名字并保存到name.json中

filename1 = 'name.json'
try:
    with open(filename1)as file_object:
        username = json.load(file_object)
except FileNotFoundError:
    with open(filename1,'w') as file_object2:
        user_ipt = input('enter your name i will rember you')
        json.dump(user_ipt,file_object2)
else:
    print(username)

重构

我们经常遇到代码能运行,但可以进一步的改进 将代码划分为一些类完成具体工作的函数,这样的过程称为重构。  重构让代码更清晰更容易理解更容易扩展。

以上代码主要功能是问候用户,我们把所有的代码放到名为greet_user()函数中

def greet_user():
    '''问候用户 并指出其名字'''
    filename1 = 'name.json'
    try:
        with open(filename1)as file_object:
            username = json.load(file_object)
    except FileNotFoundError:
        with open(filename1,'w') as file_object2:
            user_ipt = input('enter your name i will rember you')
            json.dump(user_ipt,file_object2)
    else:
        print(username)
        

但是greet_user()不仅问候了用户,还在储存了用户名时获取他,没有的时候提示用户输入一个,我们将对greet_user()函数重构,让存储用户名的代码转移到另一个函数

def get_savename(filename):
    '''将获取用户名没有返回none'''
    try:
        with open(filename) as file_object:
            sname = json.load(file_object)
            return sname
    except FileNotFoundError:
        return None
def get_newname(filename):
    '''没有的时候提示玩家输入并存储'''
    with open(filename,'w') as file_object:
        newname = input('enter you name i will rember you')
        json.dump(newname,file_object)
        return newname
def geet_username(filename):
    '''主函数 如果name有读取,如果没有输入'''
    user_name =get_savename(filename)
    if user_name:
        print(user_name)
    else:
        newname = get_newname(filename)
        print(newname)
geet_username('name.json')

 

posted @ 2016-09-03 18:09  notJoke  阅读(6157)  评论(0编辑  收藏  举报