11.4、python_存储数据

4、存储数据:

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

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

  • 可使用json在python程序之间分享数据。
  • 更重要的是,JSON数据格式并非python专用的,这让你能够将以JSON格式存储的数据与使用其他编程语言的人分享。

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

4.1、使用json.dump()json.load()

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

函 数 json.dump() 接 受 两 个 实 参: 要 存 储 的 数 据 以 及 可 用 于 存 储 数 据 的 文 件 对 象。 下 面 演 示 了 如 何 使 用 json.dump() 来 存 储 数 字 列 表:

例1、number_writer.py:

import json

numbers = [2,3,5,7,11,13]

①filename = 'numbers.json'with open(filename ,'w') as f_obj:
③    json.dump(numbers,f_obj)

程序分析:

  • 先导入模块json,再创建一个数字列表。
  • 在①处,我们指定了要将该数字列表存储到其中的文件名称,通常使用文件拓展名.json来指出文件存储数据为JSON格式。
  • 在②处,我们以写入模式打开这个文件,让json能够将数据写入其中。
  • 在③处,我们使用函数json.dump()将数字列表存储到文件numbers.json中。

下 面 示例 程 序, 使 用json.load() 将 这 个 列 表 读 取 到 内 存 中:

例2、number_reader.py:

import json

①filename = 'number.json'with open(filename) as f_obj:
③    numbers = json.load(f_obj)
    
print(numbers)

程序解析:

  • 在①处,我们确保读取的是前面写入的文件。
  • 在②处,我们以读取方式打开这个文件,因为python只需读取这个文件。
  • 在③处,我们使用函数json.load()加载存储在number.json中的信息,并将其存储到变量numbers中。

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

例3、remember_me.py:

import json

username = input("What is your name?")

filename = 'username.json'
with open(filename,'w') as f_obj:
    json.dump(username,f_obj)
    print("We'll remember you when you come back, " + username + "!")
    

例4:首先,编写一个尝试从文件usename.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 you come back, " + username + "!")
        
else: 
    print(" Welcome back, " + username + "!")

4.3、重构:

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

重构让代码更清晰、更易于理解、更容易拓展。

例5、将上述代码重构:

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 is your name? ") 
        with open( filename, 'w') as f_obj:
            json.dump( username, f_obj) 
            print(" We'll remember you when you come back, " + username + "!")
            
    else: print(" Welcome back, " + username + "!")
        
greet_user()

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

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

例6:

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 usename:
        print("Welcome back, " + username + "!")
    else:
        username = input("What is your name?")
        filename = 'username.json'
        with open(filename,'w') as f_obj:
            json.dump(username,f_obj)
            print("We'll remember you when you come back, " + username + "!")
            
greet_user()

上例中,greet_user()中还可以继续重构,我们可以将没有存储用户名时,提示用户输入的代码放在一个独立的函数中。

例7:

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 you come back," + username + "!")
        
greet_user()

小结:

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

下一章节中,你将学习高效的代码测试方式,这可帮助你确定代码正确无误,以及发现拓展线有程序时可能引入的bug.

本章代码示例来自:[美] Eric Matthes. Python编程:从入门到实践

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值