使用学生信息库创建json文件时报错

使用学生信息库创建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>

http://img1.sycdn.imooc.com//climg/6115175d0921ac9323241136.jpg

跟随课程过程中发现执行命令时报错(貌似与json模块本身相关?)

不知道是代码那一部分出错

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好!

1、报错的原因是不符合json格式规范造成的

2、可能存在的原因:使用的引号是单引号,在json中不支持单引号,把单引号换成双引号即可

http://img1.sycdn.imooc.com//climg/6115dfa109715a4003330059.jpg

若还有问题,欢迎随时提问,也可以提供student.json文件内容的截图,祝学习愉快!

  • 坻屿 提问者 #1

    http://img1.sycdn.imooc.com//climg/6115e44709389eb725521472.jpg

    json文件本身是空文件(通过信息库的__read方法创建的)

    报错依旧

    2021-08-13 11:18:10
  • 好帮手慕念 回复 提问者 坻屿 #2

    同学,你好!

    json文件是空文件,再执行self.students = json.loads(data)这行代码时,会报错

    http://img1.sycdn.imooc.com//climg/6115ed2509da2bcf05240234.jpg

    json文件内容不可为空,可以添加{},如下图

    http://img1.sycdn.imooc.com//climg/6115ee08093c844801480065.jpg

    祝学习愉快!

    2021-08-13 12:01:46
  • 坻屿 提问者 回复 好帮手慕念 #3

    问题已解决,非常感谢!Thanks♪(・ω・)ノ

    2021-08-13 12:07:59
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码