final-student-system

本文介绍了一个包含学生信息的类,实现json文件的读写操作,以及日志记录功能。核心内容包括持久化数据、添加/读取json、错误处理和数据操作(添加、修改、删除)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


'''
4.持久化json写入磁盘,添加读与写json函数
5.日志记录:添加与修改是info(消息通知),delete用warning
'''
import json
import os.path


class NotArgError(Exception):
    def __init__(self,message):
        self.message = message

class MissPathError(Exception):
    def __init__(self,message):
        self.message = message

class FormatError(Exception):
    def __init__(self,message):
        self.message = message

class StudentInfo(object):
    def __init__(self,students_path):
        self.students_path = students_path

        self.__init_path()
        self.__read()
        print(self.students,'++++++')

    def __init_path(self):
        if not os.path.exists(self.students_path):
            raise MissPathError('路径错误,文件不存在 %s'%self.students_path)

        if not os.path.isfile(self.students_path):
            raise TypeError('当前的%s不是一个文件'%self.students_path)

        if not self.students_path.endswith('.json'):
            raise FormatError('当前不是一个json文件')


    # 定义内部私有读函数,从文件读取
    def __read(self):
        with open(self.students_path,'r') as f:
            try:
                data = f.read()
            except Exception as e:
                raise e
        self.students = json.loads(data)

    # 定义内部私有写函数,写入磁盘json文件
    def __save(self):
        with open(self.students_path,'w') as f:
            json_data = json.dumps(self.students)
            f.write(json_data)



    # 获得所有学生信息
    def get_all_students(self):
        for stu_id, stu_valuse in self.students.items():
            #print(stu_valuse)
            print('学号:{}\t姓名:{}\t年龄:{}\t班级:{}\t性别:{}'.format(stu_id,
            stu_valuse['name'], stu_valuse['age'],stu_valuse['class_num'],
            stu_valuse['sex']))

    # 根据id获取学生信息
    def get_by_id(self,stu_id):
        return self.students.get(stu_id)

    # 获取所有学生id
    def get_all_id(self):
        return self.students.keys()

    # 添加学生信息
    def add(self,**kwargs):
        try:
            check = self.check_user_info(**kwargs)
        except Exception as e:
            print(e)
        self.__add(**kwargs)
        self.__save()
        self.__read()

    # 批量添加学生信息
    def adds(self,new_stus):
        for user in new_stus:
            try:
                check = self.check_user_info(**user)
            except Exception as e:
                print(e,user.get('name'))
            self.__add(**user)
        print('学生信息添加完毕。')
        self.__save()
        self.__read()

    def __add(self,**student):
        if len(self.students)==0:
            new_id = 1
        else:
            new_id = max(self.students.keys()) + 1
        self.students[new_id] = student
        #self.__save()

    # 删除学生信息
    def delete(self,stu_id):
        if stu_id not in self.students:
            print(f'需要删除的学号{stu_id}不存在.')
        else:
            del_user = self.students.pop(stu_id)
            print('学号{}的{}同学已经被删除。'.format(stu_id, del_user['name']))
        self.__save()
        #self.__read()

    # 批量删除学生信息
    def deletes(self,*stu_ids):
        #ids =list(stu_ids)
        keys = self.get_all_id()
        for id_ in stu_ids:
            if id_ not in keys:
                print(f'需要删除的学号{id_}不存在.')
            else:
                del_user = self.students.pop(id_)
                print('学号{}的{}同学已经被删除。'.format(id_, del_user['name']))
        self.__save()
        #self.__read()

    # 根据ID更新学生信息
    def update(self,stu_id, **kwargs):
        if stu_id not in self.students:
            print('需要修改的学号{}不存在。'.format(stu_id))
        try:
            check = self.check_user_info(**kwargs)
        except Exception as e:
            print(e)
        self.students[stu_id] = kwargs
        new_stu = self.students[stu_id]
        print('修改后信息为:\n 学号:{} 姓名:{} 年龄:{} 班级:{} 性别:{}'.format(stu_id,
        new_stu['name'], new_stu['age'], new_stu['class_num'],new_stu['sex']))
        self.__save()
        #self.__read()

    # 根据ID批量更新学生信息
    def updates(self,update_users):
        all_id = self.get_all_id()
        for id_,value in update_users.items():
            if id_ not in all_id:
                print('需要修改的学号{}同学不存在。'.format(id_))
                continue
            try:
                self.check_user_info(**value)
            except Exception as e:
                print(e)
            self.students[id_] = value
        print('学生信息修改完毕。')
        return self.students
        self.__save()
        #self.__read()

    # 通过关键字查询
    def select_user(self,**kwargs):
        assert len(kwargs)==1,'参数数量传递错误'
        values = self.students.values()
        key = None
        value = None
        result = []
        if 'name' in kwargs:
            key = 'name'
            value = kwargs['name']
        elif 'age' in kwargs:
            key = 'age'
            value = kwargs['age']
            for user in values:
                if user[key] == value:
                    result.append(user)
            return result
        elif 'class_num' in kwargs:
            key = 'class_num'
            value = kwargs['class_num']
        elif 'sex' in kwargs:
            key = 'sex'
            value = kwargs['sex']
        else:
            raise NotArgError('没有发现搜索的关键字')
        for user in values:
            if value in user[key]:
                result.append(user)
        return result

    # 检查学生信息是否完整
    def check_user_info(self,**kwargs):
        assert len(kwargs)==4,'参数必须是4个'
        if 'name' not in kwargs:
            raise NotArgError('缺少学生姓名')
        if 'age' not in kwargs:
            raise NotArgError('缺少学生年龄')
        if 'class_num' not in kwargs:
            raise NotArgError('缺少学生班级')
        if 'sex' not in kwargs:
            raise NotArgError('缺少学生性别')

        name_value = kwargs['name']
        age_value = kwargs['age']
        class_value = kwargs['class_num']
        sex_value = kwargs['sex']

        if not isinstance(name_value,str):
            raise TypeError('name应该是字符串类型')
        if not isinstance(age_value,int):
            raise TypeError('age应该是整型')
        if not isinstance(class_value,str):
            raise TypeError('class_num应该是字符串类型')
        if not  isinstance(sex_value,str):
            raise TypeError('sex应该是字符串类型')

    students = {1: {'name': 'mark', 'age': 20, 'class_num': 'A', 'sex': 'boy'},
            2: {'name': 'nancy', 'age': 19, 'class_num': 'B', 'sex': 'girl'},
            3: {'name': 'xiaoming', 'age': 18, 'class_num': 'B', 'sex': 'boy'},
            4: {'name': 'milk', 'age': 19, 'class_num': 'A', 'sex': 'boy'}}

if __name__ == '__main__':
    stu = StudentInfo('students.json')
    #print(stu.students)
    stu.get_all_students()
    print('------添加,更改,删除单条数据-------------')
    # stu.add(name='xiaoluo',age=18,class_num='B',sex='girl')
    stu.update(4,name='MilkZhang',class_num='A',sex='boy',age=19)
    stu.delete(2)
    stu.get_all_students()
    print('========添加多个记录=========')
    stus = [{'name': 'xiaowang', 'age': 20, 'class_num': 'A', 'sex': 'boy'},
            {'name': 'xiaoli', 'age': 19, 'class_num': 'B', 'sex': 'girl'},
            {'name': 'xiaozhang', 'age': 18, 'class_num': 'B', 'sex': 'boy'}]
#    stu.adds(stus)
    stu.get_all_students()
    print('++++++删除多条记录+++++++++')
    stu.deletes(1,10)
    stu.get_all_students()
    print('-----更新多个记录-------')
    update_users= {6:{'name': 'xiaowang', 'age': 18, 'class_num': 'B', 'sex': 'boy'},
            10:{'name': 'xiaozhang', 'age': 18, 'class_num': 'B', 'sex': 'boy'},
            8: {'name': '小张', 'age': 20, 'class_num': 'B', 'sex': 'boy'}}
    stu.updates(update_users)
    stu.get_all_students()
    print('+++++++模糊查找++++++++')
    result = stu.select_user(name='li')
    print(result)




# students = {1:{'name':'mark','age':20,'class_num':'A','sex':'boy'},
#             2:{'name':'nancy','age':19,'class_num':'B','sex':'girl'},
#             3:{'name':'xiaoming','age':18,'class_num':'B','sex':'boy'},
#             4:{'name':'milk','age':19,'class_num':'A','sex':'boy'}}

    # stu_id = students.keys()
    # stu_valuse = students.values()
    # return students




# users = select_user(name='mark')
# print(users)
# print('++++++++++++++')



# add_user(name='xiaoluo',class_num='B' ,age=17,sex='girl')
# delete_user(2)
# update_user(4,name='milk',class_num='B',sex='boy',age=20)
#ser = select_user(name='mile')
# get_all_students()





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值