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

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

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下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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