Python-存储数据-Thu-Fri

发布于:2024-12-21 ⋅ 阅读:(11) ⋅ 点赞:(0)

10.4存储数据

一般python会把用户输入的数据存储在列表或字典里。当关闭程序后这些数据也会消除。json模块可以把这些数据转存到文件里,json格式的文件也可以供其他语言的程序使用。

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

我们先用json.dump()来存储数据,这个函数接受俩实参,分别是需要存储的数据结构和可用于存储的文件对象。

import json
#导入json模块
numbers = ['1','2','3']
#创建需要存储的数据
filename = 'test\\numbers.json'
#指定存储的文件,json文件的后缀是.json
with open(filename,'w') as f_obj:
#以写入模式打开文件
    json.dump(numbers,f_obj)
#使用json.dump()将numbers列表存进numbers.json文件

使用json.load()将文件数据读取到内存。

import json

filename = 'test\\numbers.json'
with open(filename) as f_obj:
#用读取模式打开文件
    num = json.load(f_obj)
#json.load()加载存储在文件里的数据
#再将数据从进变量num
print(num)

>>>['1', '2', '3']

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

首先编写一个保存用户输入的数据。

import json
#导入模块
username = input('what is your name: ')
#提示用户输入
filename = 'test\\username.json'
#指定存储文件
with open(filename,'w') as f_obj:
#用写入模式打开文件
    json.dump(username,f_obj)
#用json.dump()把用户的输入存进json文件
print('We will remember you when you come back ' +username+ '!')
#提示已存储用户名
>>>what is your name: haha
We will remember you when you come back haha!

再编写一个读取文件载入数据的程序。

import json

filename = 'test\\username.json'
with open(filename) as f_obj:
#用只读模式打开文件
    username = json.load(f_obj)
#用json.load()读取文件里的用户名把它存到变量里
print('Welcome back ' +username+ '!')
#欢迎用户回归,用户名已恢复
>>>Welcome back haha!

接下来用try-except-else代码块把两个程序结合起来。在文件里找到用户名,提示欢迎回归,如果没找到文件就让用户输入用户名,提示已存好用户名。
remember_me.py

import json

filename = 'test\\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 will remember you when you come back ' +username+ '!')
else:
    print('Welcome back ' +username+ '!')

>>>Welcome back haha!

10.4.3 重构

重构:把代码划分为一系列具体工作的函数。
重构remember_me.py第一步,首先把它放到函数里。

import json

def greet_user():#创建函数,注意缩进
   """问候用户""" 
   filename = 'test\\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 will remember you when you come back ' +username+ '!')
   else:
        print('Welcome back ' +username+ '!')

greet_user()#改动行标注
>>>Welcome back haha!

多行缩进选中,再按tab键或者CTRL+】。取消多行缩进,选中然后CTRL+【。
重构 greet_user(),分离出从文件获取用户名的代码。

import json

def get_stored_user():
    """获取存储用户名"""
    filename = 'test\\username.json'
    try:
        with open(filename) as f_obj:
           username = json.load(f_obj)
    except FileNotFoundError:
#上面几行为原greet_user函数里的用户名获取的功能代码
        return None
#报错返回None
    else:
#若成功执行则函数返回用户名
        return username

def greet_user():
    """问候用户"""
    username = get_stored_user()
#从get_stored_user()函数的返回值获取用户名
    if username:
#如果存在用户名则问候用户
        print('Welcome back ' +username+ '!')
    else:#否则提示用户输入用户名并存储
        username = input('what is your name: ')
        with open(filename,'w') as f_obj:
            json.dump(username,f_obj)
        print('We will remember you when you come back ' +username+ '!')

greet_user()

>>>Welcome back haha!

将非预期返回值设为None有利于我们对代码进行简单测试。
继续重构greet_user(),分离提示新用户输入的功能。

import json

def get_stored_user():
    """获取存储用户名"""
    filename = 'test\\username.json'
    try:
        with open(filename) as f_obj:
           username = json.load(f_obj)
    except FileNotFoundError:
        return None
    else:
        return username

def get_new_user():
    """提示用户输入"""
    username = input('what is your name: ')
    filename = 'test\\username.json'
    with open(filename,'w') as f_obj:
        json.dump(username,f_obj)
#以上为greet_user()中的提示用户输入源代码
    return username
#函数返回用户输入的用户名        
def greet_user():
    """问候用户"""
    username = get_stored_user()
    if username:
        print('Welcome back ' +username+ '!')
    else:
        username = get_new_user()
#从get_new_user()的返回值获取用户名
        print('We will remember you when you come back ' +username+ '!')

greet_user()

10-11

import json

num = input('enter a number of your love:')
with open('test\\numbers.json ','w') as f_obj:
    json.dump(num,f_obj)
   
>>>enter a number of your love:12
import json

filename = 'test\\numbers.json'
with open(filename) as f_obj:
    num = f_obj.read()
print('I know your favorite number! It is :' +num+ '.')

>>>I know your favorite number! It is :"12".

10-12

import json

filename = 'test\\numbers.json'

try:
    with open(filename) as f_obj:
        num = f_obj.read()
except FileNotFoundError:
    num = input('enter a number of your love:')
    with open('test\\numbers.json ','w') as f_obj:
        json.dump(num,f_obj)
print('I know your favorite number! It is :' +num+ '.')

>>>enter a number of your love:13
I know your favorite number! It is :13.

10-12

import json

def get_stored_user():
    """获取存储用户名"""
    filename = 'test\\username.json'
    try:
        with open(filename) as f_obj:
           username = json.load(f_obj)
    except FileNotFoundError:
        return None
    else:
        return username

def get_new_user():
    """提示用户输入"""
    username = input('what is your name: ')
    filename = 'test\\username.json'
    with open(filename,'a') as f_obj:
        json.dump(username,f_obj)
    return username
        
def greet_user():
    """问候用户"""
    username = get_stored_user()
    answer = input("Are you " +username+ " ?(y/n):")
    if answer.lower() == 'y':
        print('Welcome back ' +username+ '!')
    else:
        username = get_new_user()
        print('We will remember you when you come back ' +username+ '!')

greet_user()

>>>Are you haha ?(y/n):n
what is your name: hehe
We will remember you when you come back hehe!