持久化存储的简单案例

# 1. 学生管理,持久化存储
# 输入数字1,添加学生信息(id名字,年纪,性别)
# 第一个学生id为101 后续学生自动加1
# 输入数字2,查看所有学生信息
# 输入数字3,统计学生平均年纪
# 输入数字4,统计学生性别比例
# 输入数字0,退出系统

# 创建数据存储结构
datas = [{
    "id": 101,
    "name": "张三",
    "age": 18,
    "sex": "男"
}]
# 格式化菜单
menu = """输入数字1,添加学生信息(id名字,年纪,性别)
输入数字2,查看所有学生信息
输入数字3,统计学生平均年纪
输入数字4,统计学生性别比例
输入数字0,退出系统"""

# 使用常量存储路径防止书写错误
FILE_PATH = "./0722.txt"


# 保存
# 将数据保存为文件
def save_data():
    with open(FILE_PATH, mode="w", encoding="utf8") as f:
        # 使用json的dumps方法将数据序列化为字符串
        content = json.dumps(datas)
        # 将字符串写入文件
        f.write(content)


# 读取
def load_data():
    # 使用global声明datas为全局变量,
    # 方便文件的数据传入datas
    global datas
    if os.path.exists(FILE_PATH):
        with open(FILE_PATH, mode="r", encoding="utf8") as f:
            # 使用json的load方法将文件(f)中的数据读取赋值给datas
            datas = json.load(f)

# 规范用户在首页的选择
def legal_option():
    while True:
        option = input("请输入您要进行的操作:")
        if option in [str(i) for i in range(5)]:
            return option
        else:
            print("输入不合法,请重新输入")


# 规范用户输入的姓名
def legal_name():
    while True:
        name = input("请输入姓名:")
        if 1 < len(name) < 5:
            return name
        else:
            print("输入不合法,姓名长度应该在2-4")


# 规范用户输入的年龄
def legal_age():
    while True:
        age_str = input("请输入年纪:")
        if age_str.isdigit() and 14 < int(age_str) < 25:
            return int(age_str)
        else:
            print("年纪输入不合法,应该在15-24")


# 规范用户输入的性别
def legal_sex():
    while True:
        sex = input("请输入性别:")
        if sex in ["男", "女"]:
            return sex
        else:
            print("性别输入不合法,只能输入'男'或'女'")


# 规范用户对是否继续的选择
def legal_option_sub():
    while True:
        option_sub = input("是否继续Y/N")
        if option_sub in ['Y', 'y', 'N', 'n']:
            return option_sub
        else:
            print("输入不规范")


# 将添加学生封装成方法
def add_student():
    while True:
        datas.append({
            "id": 101 if not datas else datas[-1]["id"] + 1,
            "name": legal_name(),
            "age": legal_age(),
            "sex": legal_sex()
        })
        option_sub = legal_option_sub()
        if option_sub == "N" or option_sub == "n":
            break

# 将查看数据封装为方法
def show_all_student():
    for item in datas:
        print(f'id:{item["id"]},姓名:{item["name"]},年纪:{item["age"]},性别:{item["sex"]}')


# 将年龄的平均值计算封装为方法
def avg_age():
    total = 0
    for item in datas:
        total += item["age"]
    print(total / len(datas))


# 将性别比例的功能封装成方法
def sex_ratio():
    if datas:
        count = 0
        for item in datas:
            if item["sex"] == '男':
                count += 1
        print(f"男生比例{count / len(datas)},女生比例{1-count/len(datas)}")
    else:
        print("还没有录入学生")


# main方法,用于打包
def main():
    while True:
        load_data()
        print(menu)
        option = legal_option()
        if option == "0":
            # 退出系统
            exit()
        if option == "1":
            add_student()
            save_data()
        if option == "2":
            show_all_student()
        if option == "3":
            avg_age()
        if option == "4":
            sex_ratio()
        option_sub = legal_option_sub()
        if option_sub == "N" or option_sub == "n":
            break


main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值