'''
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()
final-student-system
最新推荐文章于 2025-09-26 13:01:53 发布
本文介绍了一个包含学生信息的类,实现json文件的读写操作,以及日志记录功能。核心内容包括持久化数据、添加/读取json、错误处理和数据操作(添加、修改、删除)。
1384

被折叠的 条评论
为什么被折叠?



