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