python写学生管理系统如何保存和修改数据?

使用python写学生管理系统应该怎么保存数据和读取数据?
我现在保存数据好像出现问题了,用append不能保存在同一个列表里面

[{'id': '01', 'name': 'zzz', 'gender': 'male', 'tel': 114, 'age': 18}][{'id': '02', 'name': 'b', 'gender': 'm', 'tel': 1, 'age': 1}]

保存这样后重新载入文件修改数据或者读取数据就会出错是什么回事?


import os
info = []  # 等待储存学生信息
# 定义一个函数
def print_info():
    # 打印提示信息
    print()
    print('---------------->学生管理系统<-----------------')
    print()
    print(' 1 -> 添加学生信息        2 -> 删除学生信息')
    print(' 3 -> 修改学生信息        4 -> 查询单个学生信息')
    print(' 5 -> 查询所有学生信息     6 -> 退出程序')
    print('---------------------------------------------')


def main():
    student1 = Student()
    student1.load_data()
    while True:
        print_info()
        num = input('请输入您的选项:')
        if num == "1":  # print(‘增加学生’)
            student1.add_info()
            student1.save_data()
        if num == "2":  # print('删除学生‘)
            student1.del_info()
        if num == "3":  # print ('修改学生信息')
            student1.change_info()
        if num == "4":  # print ('查询学生信息')
            student1.search_info()
        if num == "5":  # print ('显示学生信息')
            student1.show_info()
        elif num == "6":
            exit_flag = input("确定要退出系统?\n yes/no")
            if exit_flag == 'yes':
                student1.save_data()
                print("欢迎下次使用")
                return
            else:
                print("请进行下一步操作")

class Student():
    def add_info(self):
        global info
        new_id = input("输入学号:")
        for i in info:
            if new_id == i['id']:
                print("此学生已经存在,请勿重复添加")
                return
        new_name = input("输入姓名:")
        new_tel = int(input("请输入电话号码:"))
        new_gender = input("输入性别:")
        new_age = int(input("请输入年龄:"))
        info_dict = {'id': new_id, 'name': new_name, 'gender': new_gender, 'tel': new_tel, 'age': new_age}
        info.append(info_dict)
        print(info)


    def del_info(self):
        del_name = input("请输入删除学生名字:")
        with open('student1.txt', 'r+') as f:
            date=f.read().strip()
            info=eval(date)
        for i in info:
            if del_name == i['name']:
                date.remove(i)
                break
        else:
            print("该学生不存在!")


    def change_info(self):
        change_name = input("请输入要修改的学生的姓名:")
        global info
        for i in info:
            if change_name == i['name']:
                change_tel = input("请输入修改后的电话[直接回车则不修改]:")
                if len(change_tel) > 0:
                    i['tel'] = int(change_tel)
                change_id = input("请输入修改后的学号[直接回车则不修改]:")
                if len(change_id) > 0:
                    i['id'] = change_id
                change_age = input("请输入修改后的年龄[直接回车则不修改]:")
                if len(change_age) > 0:
                    i['age'] = int(change_age)
                change_gender = input("请输入修改后的性别[直接回车则不修改]:")
                if len(change_gender) > 0:
                    i['gender'] = change_gender
                print("修改完毕!")
                return
        else:
            print("查无此人!")


    def search_info(self):
        with open('student1.txt', 'r') as f:
            date=f.read().strip()
            date=eval(date)
        search_id = input("请输入需要查询的学号")
        for i in date:
            if search_id == i['id']:
                print("找到该学生的信息如下:")
                print("学号:\t姓名:\t性别:\t年龄:\t电话号码:")
                #print(f"名字:{i['name']}\n性别:{i['gender']}\n年龄:{i['age']}\n手机号码:{i['tel']
                print(f"{i['id']}\t\t{i['name']}\t\t{i['gender']}\t\t{i['age']}\t\t{i['tel']}")
                break
        else:
            print("该学生不存在")


    def show_info(self):
        with open('student1.txt', 'r') as f:
            print("学号:\t姓名:\t性别:\t年龄:\t电话号码:")
            date=f.read().strip()
            date=eval(date)
        for i in date:
                print(f"{i['id']}\t\t{i['name']}\t\t{i['gender']}\t\t{i['age']}\t\t{i['tel']}")



    def load_data(self):
            # 判断文件是否存在,存在则读取数据;不存在则新增
            if os.path.exists("student1.txt"):
                f = open("student1.txt", "a+", encoding="utf-8")
                global info
                date = f.read()
                if len(date) > 0:
                    date = eval(date)
                    info = date
            else:
                f = open("student1.txt", "w", encoding="utf-8")
            f.close()


    def save_data(self):
        """保存数据"""
        f = open("student1.txt", "a")
        # 文件必须存储字符串数据
        f.write(str(info))
        f.close()


if __name__ == '__main__':
    main()

在你的代码中,你定义了一个全局变量info来存储学生信息,但在每个函数中都没有使用global关键字来声明info,导致在函数中使用的info变量实际上是局部变量,而不是全局变量。因此,当你在一个函数中使用append来添加学生信息时,实际上是在局部变量中添加,而不是在全局变量中添加。这就是为什么你不能在同一个列表中保存所有学生信息的原因。

为了解决这个问题,你需要在每个函数中使用global关键字来声明info变量是全局变量,或者将info变量作为类的属性来使用。同时,你需要在保存数据时将info变量写入文件中,而不是将其作为字符串写入文件中。你可以使用json模块来将info变量转换为json格式的字符串,并将其写入文件中。在载入数据时,你需要使用json模块将文件中的json格式字符串转换为Python对象,并将其赋值给info变量。