使用学生信息库创建json文件时报错
#coding:utf-8
#学生信息库
import json
import logging
import os
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()
def __init_path(self):
if not os.path.exists(self.students_path): #判断路径是否存在
raise MissPathError(f'不存在该文件:{self.students_path}')
if not os.path.isfile(self.students_path):
raise TypeError(f'当前的{self.students_path}不是一个文件')
if not self.students_path.endswith('json'): #判断文件是否为json格式
raise FormatError('当前不是一个json文件')
def __read(self):
with open(self.students_path,'r',encoding='utf-8') as f:
try:
data=f.read()
except Exception as e:
raise e
self.students = json.loads(data)
def __save(self):
with open(self.students_path,'w') as f:
json_data=json.dumps(self.students)
f.write(json_data)
def get_all(self):
for id_, value in self.students.items():
print(f"学号:{id_},姓名:{value['name']},"
f"年龄:{value['age']},性别:{value['sex']},班级:{value['class_number']}")
return self.students
def check_user_info(self,**kwargs): #在函数传参时kwargs前面需要加**将关键字参数转化为字典
assert len(kwargs)==4,'参数必须是四个'
if 'name' not in kwargs: #传参后在使用时直接写kwargs表示一个所有关键字参数键值对组成的字典
raise NotArgError('未发现学生姓名参数')
if 'age' not in kwargs:
raise NotArgError('缺少学生年龄参数')
if 'sex' not in kwargs:
raise NotArgError('缺少学生性别参数')
if 'class_number' not in kwargs:
raise NotArgError('缺少学生班级参数')
name_value=kwargs['name']
age_value=kwargs['age']
sex_value=kwargs['sex']
class_value=kwargs['class_number']
if not isinstance(name_value,str):
raise TypeError('name应该是字符串类型')
if not isinstance(age_value,int):
raise TypeError('age应该是整形类型')
if not isinstance(sex_value,str):
raise TypeError('sex应该是字符串类型')
if not isinstance(class_value,str):
raise TypeError('class_number应该是字符串类型')
def add(self,**student):
try:
self.check_user_info(**student) #类之中函数的相互调用需要借助self
except Exception as e:
raise e #只涉及一个的增删改(没有后续的增删改)可以直接报错停止程序
self.__add(**student)
def adds(self,new_students): # 批量添加
for student in new_students:
try:
self.check_user_info(**student)
except Exception as e:
print(e,student.get('name'))
continue #涉及多个的增删改(要考虑后续的增删改),就必须采用continue
self.__add(**student)
def __add(self,**student):
if len(self.students)==0:
new_id=1
else:
new_id=max(self.students)+1
self.students[new_id] = student
def delete(self,student_id):
if student_id not in self.students:
print(f"{student_id}并不存在")
else:
user_info = self.students.pop(student_id)
print(f"学号是{student_id}的{user_info['name']}同学的信息已被删除!")
def deletes(self,ids): #批量删除
for id_ in ids:
if id_ not in self.students:
print(f"{id_}不存在于学生库中")
continue
deleted_student_info=self.students.pop(id_)
print(f"学号为{id_}的学生{deleted_student_info['name']}的信息已删除")
def update(self,student_id, **kwargs):
if student_id not in self.students:
print(f'并不存在{student_id}这个学号')
try:
self.check_user_info(**kwargs)
except Exception as e:
raise e
self.students[student_id] = kwargs
print('同学信息更新完毕')
def updates(self,update_students):
for student in update_students:
try:
id_ = list(student.keys())[0]
except IndexError as e:
print(e)
continue
if id_ not in self.students:
print(f"学号{id_}不存在")
continue
user_info=student[id_]
try:
self.check_user_info(**user_info) #通过**可以直接把字典传入函数(方法)中
except Exception as e:
print(e)
continue
self.students[id_]=user_info
print('所有用户信息更新完成')
def get_by_id(self,student_id):
return self.students.get(student_id)
def search_users(self,**kwargs):
assert len(kwargs)==1,'参数数量传递错误'
values = list(self.students.values())
key = None
value = None
result = []
if 'name' in kwargs:
key = 'name'
value = kwargs[key]
elif 'sex' in kwargs:
key = 'sex'
value = kwargs[key]
elif 'age' in kwargs:
key = 'age'
value = kwargs[key]
elif 'class_number' in kwargs:
key = 'class_number'
value = kwargs[key]
else:
raise NotArgError('没有发现搜索的关键字')
for user in values: #values:[{name,age,sex,class_number},{name,age,sex,class_number}]
if value in user[key]: #把两边都转化为了字符串进行成员比较
#把==改成了in就使得搜索拥有了模糊搜索效果
result.append(user)
return result
students={
1:{
'name':'dewei',
'age':33,
'class_number':'A',
'sex':'boy'
},
2:{
'name':'小慕',
'age':10,
'class_number':'B',
'sex':'boy'
},
3:{
'name':'小曼',
'age':18,
'class_number':'C',
'sex':'girl'
},
4:{
'name':'小高',
'age':18,
'class_number':'C',
'sex':'boy'
},
5:{
'name':'小云',
'age':18,
'class_number':'B',
'sex':'girl'
}
}
if __name__=='__main__':
student_info=StudentInfo('students.json')
跟随课程过程中发现执行命令时报错(貌似与json模块本身相关?)
不知道是代码那一部分出错
24
收起
正在回答
1回答
同学,你好!
1、报错的原因是不符合json格式规范造成的
2、可能存在的原因:使用的引号是单引号,在json中不支持单引号,把单引号换成双引号即可
若还有问题,欢迎随时提问,也可以提供student.json文件内容的截图,祝学习愉快!
Python全能工程师
- 参与学习 人
- 提交作业 16233 份
- 解答问题 4470 个
全新版本覆盖5大热门就业方向:Web全栈、爬虫、数据分析、软件测试、人工智能,零基础进击Python全能型工程师,从大厂挑人到我挑大厂,诱人薪资在前方!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星