【python3小白上路系列】文件与异常(二)

【早起挑战第3天】失败,八点起的,昨天实在是太累了,为了保证效率,今天多睡了一个多小时。

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

昨天应该是把列表写入到json文件中,代码如下:

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.load() 将这个列表读取到内存中:

import json

filename = 'numbers.json'
with open(filename) as f_obj:
    numbers = json.load(f_obj)

print(numbers)

运行结果:


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

对于用户生成的数据,使用json 保存它们大有裨益,因为如果不以某种方式进行存储,等程序停止运行时用户的信息将丢失。下面来看一个这样的例子:用户首次运行程序时被提示输入自己的名字,这样再次运行程序时就记住他了。

我们先来存储用户的名字:

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 + "!")

现在再编写一个程序,向其名字被存储的用户发出问候:

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 you come back, " + username + "!")
else:
    print("Welcome back, " + username + "!")

运行结果:


10.4.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 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() ,让它不执行这么多任务。为此,我们首先将获取存储的用户名的代码移到另一个函数中:

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 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() 中的另一个代码块提取出来:将没有存储用户名时提示用户输入的代码放在一个独立的函数中:

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()

10.5 小结

在本章中,你学习了:

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

你可能感兴趣的:(【python3小白上路系列】文件与异常(二))