【Python学习】用json文件存储数据

10.4 存储数据
10.4.1 使⽤json.dump() 和json.load()
我们来编写⼀个存储⼀组数的简短程序,再编写⼀个将这些数读取到内存中的程
序。第⼀个程序将使⽤json.dump() 来存储这组数,⽽第⼆个程序将使⽤
json.load() 。
函数json.dump() 接受两个实参:要存储的数据,以及可⽤于存储数据的⽂件对
象。下⾯演⽰了如何使⽤json.dump() 来存储数字列表:
import json

numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
# 指定了要将该数字列表存储到哪个⽂件中

with open(filename, 'w', encoding='utf-8') as f:
    json.dump(numbers, f)
    # 使⽤函数json.dump()将数字列表存储到⽂件numbers.json中。

import json

filename = 'numbers.json'
下⾯再编写⼀个程序,使⽤json.load() 将列表读取到内存中:
with open(filename, encoding='utf-8') as f:
    number = json.load(f)

print(number)
json.load(f)读取数据时报错了
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
怀疑是前面数据写入时数据不对,限制utf-8编码格式后重新读取正常

10.4.2 保存和读取⽤户⽣成的数据
下⾯来看⼀个这样的例⼦:提⽰⽤户⾸次运⾏程序时输
⼊⾃⼰的名字,并在再次运⾏程序时记住他。
import json

username = input("请输入你的名字: ")
filename1 = 'name.json'
with open(filename1, 'w') as f1:
    json.dump(username, f1)
    print(f'已登记{username}')

# 我们再来读取数据
filename1 = 'name.json'
with open(filename1) as f1:
    username = json.load(f1)
    print(f'欢迎{username}')
下面我们用try--except 代码块将上面的代码块合并
考虑用户数据可能还没有创建过,读取不到文件,我们应该对就此场景捕捉异常
import json

# 如果以前存储了⽤户名,就加载它。
# 否则,提⽰⽤户输⼊⽤户名并存储它。
filename = 'username.json'
try:
    with open(filename) as f:
        username = json.load(f)
except FileNotFoundError:
    username = input("你的名字是:")
    with open(filename, 'w') as f:
        json.dump(username, f)
        print(f"我们将记录登记您, {username}!")
else:
    print(f"欢迎回来, {username}!")
10.4.3 重构上面的代码
我们可以将不同的功能模块放置到对应的函数中重构让代码更清晰、更易于理解、更容易扩展。

import json

def get_stored_username():
    """如果存储了⽤户名,就获取它。"""
    filename = 'username.json'
    try:
        with open(filename) as f:
            username = json.load(f)
    except FileNotFoundError:
        return None
    else:
        return username

def get_new_username():
    """提⽰⽤户输⼊⽤户名。"""
    username = input("请输入您的名字:")
    filename = 'username.json'
    with open(filename, 'w') as f:
        json.dump(username, f)
        return username

def greet_user():
    """问候⽤户,并指出其名字。"""
    username = get_stored_username()
    if username:
        print(f"欢迎回来, {username}!")
    else:
        username = get_new_username()
        print(f"我们将登记您的姓名, {username}!")


greet_user()
在这个最终版本中,每个函数都执⾏单⼀⽽清晰的任务。我们
调⽤greet_user() ,它打印⼀条合适的消息:要么欢迎⽼⽤户回来,要么问候新
⽤户。为此,它⾸先调⽤get_stored_username() ,该函数只负责获取已存储
的⽤户名(如果存储了的话)。最后在必要时调⽤get_new_username() ,该函
数只负责获取并存储新⽤户的⽤户名。

你可能感兴趣的:(Python,json,开发语言,python,学习)