student.py文件,用于学生属性类的定义,包的声明
import time
class Student:
def __init__(self, id, name, gender, english, python):
self.id = id
self.name = name
self.gender = gender
self.english = english
self.python = python
self.total = english + python
def __str__(self):
return f'{self.id},{self.name},{self.gender},{self.english},{self.python},{self.total}'
main.py文件,用于函数的执行
from managerSystem import *
if __name__ == "__main__":
student_manager = StudentManager()
student_manager.run()
managerSystem.py,用于各种函数的实现,有成绩不能大于100以及学号不能相同的限制,对多为学生姓名相同的情况做了处理
from student import *
class StudentManager:
def __init__(self):
self.student_list = []
def run(self):
# 加载学生信息
self.load_student()
while True:
# 打印菜单
self.show_menu()
try:
choice = int(input("请选择:"))
except ValueError:
print("输入无效,请输入整数类型")
else:
if choice in [0, 1, 2, 3, 4, 5, 6, 7]:
if choice == 0:
answer = input("您确定要退出系统吗(输入y结束):")
if answer == "y":
print("谢谢使用!!!")
break
else:
continue
elif choice == 1:
self.add_student()
elif choice == 2:
self.del_student()
elif choice == 3:
self.modify_student()
elif choice == 4:
self.search_student()
elif choice == 5:
self.sort_student()
elif choice == 6:
self.total_student()
time.sleep(0.2)
elif choice == 7:
self.show_student()
input("请输入任意键继续...")
else:
print("输入错误,请重新输入")
def add_student(self):
global id,name,gender,english,python
while True:
# 输入学号
while True:
id = input("请输入ID:")
if not id:
print("输入错误,请重新输入")
continue
# 不能有相同学号的学生
for i in self.student_list:
if i.id == id:
print("学号与其他学生重复,请重新输入")
break
else:
break
# 输入姓名
while True:
name = input("请输入姓名:")
if not name:
print("输入错误,请重新输入")
continue
else:
break
# 输入性别
while True:
gender = input("请输入性别:")
if not gender:
print("输入无效,请重新输入")
continue
else:
break
# 输入英语成绩
while True:
try:
english = int(input("请输入英语成绩:"))
if english > 100:
print("请输入100以下的英语成绩")
continue
else:
break
except ValueError:
print("输入错误,请输入整数类型")
continue
# 输入python成绩
while True:
try:
python = int(input("请输入python成绩:"))
if python > 100:
print("请输入100以下的python成绩")
continue
else:
break
except ValueError:
print("输入错误,请输入整数类型")
continue
# 创建学生对象
student = Student(id, name, gender, english, python)
# 将学生保存到列表中
self.student_list.append(student)
# 保存到文件
self.save_student()
print("保存成功")
answer = input("是否继续输入(输入y继续):")
if answer == 'y':
continue
else:
break
def del_student(self):
# 用于存储多个学生的列表
student_list = []
# 与用户输入的姓名相同的学生个数
count = 0
# 用户选择删除的第choise个学生
choise = 0
# 没有任何学生的处理方法
if len(self.student_list) == 0:
print("无任何学生信息")
else:
# 用户输入需要删除学生的姓名
while True:
del_name = input("请输入要删除的学生姓名:")
if del_name:
# 寻找是否有该学生
for i in self.student_list:
if i.name == del_name:
student_list.append(i)
count += 1
# 找不到该学生
if count == 0:
print("查无此人!")
break
# 与用户输入的姓名相同的学生大于等于一位时
elif count > 1:
print("学号\t\t姓名\t\t性别\t\t英语成绩\t\tpython成绩\t\t总成绩")
for i in student_list:
print(f"{i.id}\t\t{i.name}\t\t{i.gender}\t\t{i.english}\t\t{i.python}\t\t{i.total}")
while True:
try:
choise = int(input("请选择需要删除的学生为第几位学生:"))
except ValueError:
print("输入错误,请输入整数类型")
continue
else:
if count >= choise > 0:
break
else:
print("输入错误,请重新输入")
continue
elif count == 1:
pass
# 删除该学生
self.student_list.remove(student_list[choise - 1])
# 保存到文件
self.save_student()
print("删除成功")
break
else:
print("输入错误,请重新输入")
continue
def modify_student(self):
global name,id,gender,english,python
# 用于存储多个学生的列表
student_list = []
# 与用户输入的姓名相同的学生个数
count = 0
# 用户选择删除的第choise个学生
choise = 0
# 没有任何学生的处理方法
if len(self.student_list) == 0:
print("无任何学生信息")
else:
# 用户输入需要修改学生的姓名
while True:
modify_name = input("请输入要修改的学生的姓名:")
if modify_name:
# 寻找是否有该学生
for i in self.student_list:
if i.name == modify_name:
student_list.append(i)
count += 1
# 找不到该学生
if count == 0:
print("查无此人!")
break
# 与用户输入的姓名相同的学生大于等于一位时
elif count > 1:
print("学号\t\t姓名\t\t性别\t\t英语成绩\t\tpython成绩\t\t总成绩")
for i in student_list:
print(f"{i.id}\t\t{i.name}\t\t{i.gender}\t\t{i.english}\t\t{i.python}\t\t{i.total}")
while True:
try:
choise = int(input("请选择需要修改的学生为第几位学生:"))
except ValueError:
print("输入错误,请输入整数类型")
continue
else:
if count >= choise > 0:
break
else:
print("输入错误,请重新输入")
continue
elif count == 1:
pass
# 删除该学生
self.student_list.remove(student_list[choise - 1])
# 输入学号
while True:
id = input("请输入ID:")
if not id:
print("输入错误,请重新输入")
continue
# 查看是否有其他学生有相同的学号
for item in self.student_list:
if item.id == id:
print("学号与其他学生重复,请重新输入")
break
else:
break
# 输入姓名
while True:
name = input("请输入姓名:")
if not name:
print("输入错误,请重新输入")
continue
else:
break
# 输入性别
while True:
gender = input("请输入性别:")
if not gender:
print("输入错误,请重新输入")
continue
else:
break
# 输入英语成绩
while True:
try:
english = int(input("请输入英语成绩:"))
if english > 100:
print("请输入100以下的英语成绩")
continue
else:
break
except ValueError:
print("输入错误,请输入整数类型")
continue
# 输入python成绩
while True:
try:
python = int(input("请输入python成绩:"))
if python > 100:
print("请输入100以下的python成绩")
continue
else:
break
except ValueError:
print("输入错误,请输入整数类型")
continue
# 创建学生对象
student = Student(id, name, gender, english, python)
# 将学生保存到列表中
self.student_list.append(student)
# 保存到文件
self.save_student()
print("修改成功!")
break
else:
print("输入错误,请重新输入")
continue
def search_student(self):
# 用于存储多个学生的列表
student_list = []
# 与用户输入的姓名相同的学生个数
count = 0
# 没有任何学生的处理方法
if len(self.student_list) == 0:
print("无任何学生信息")
else:
# 用户输入需要查找学生的姓名
while True:
search_name = input("请输入要查询的学生的姓名:")
if search_name:
# 寻找该学生
for i in self.student_list:
if i.name == search_name:
student_list.append(i)
count += 1
# 找不到人
if count == 0:
print("查无此人")
break
# 找到了人
else:
print("学号\t\t姓名\t\t性别\t\t英语成绩\t\tpython成绩\t\t总成绩")
# 输出学生信息
for i in student_list:
print(f"{i.id}\t\t{i.name}\t\t{i.gender}\t\t{i.english}\t\t{i.python}\t\t{i.total}")
input("请输入任意键继续...")
break
else:
print("输入错误,请重新输入")
continue
def sort_student(self):
global sort_choise_bool,cmpfun
# 没有任何学生的处理方法
if len(self.student_list) == 0:
print("无任何学生信息")
else:
# 选择升序或降序
sort_choise = input("请选择(0.升序 1.降序):")
if sort_choise == '1':
sort_choise_bool = True
elif sort_choise == '0':
sort_choise_bool = False
else:
print("输入错误,请重新输入")
self.sort_student()
# 排序!!!!!!!!!!!!!!!!!!!!
while True:
mode = input("请选择排序方式(1.按照学号排序 2.按照姓名排序 3.按照性别排序 4.按照英语成绩排序 5.按照python成绩排序 6.按照总成绩排序):")
try:
import operator
except ImportError:
cmpfun = lambda x: x.count
else:
if mode == '1':
cmpfun = operator.attrgetter("id")
elif mode == '2':
cmpfun = operator.attrgetter("name")
elif mode == '3':
cmpfun = operator.attrgetter("gender")
elif mode == '4':
cmpfun = operator.attrgetter("english")
elif mode == '5':
cmpfun = operator.attrgetter("python")
elif mode == '6':
cmpfun = operator.attrgetter("total")
else:
print("输入错误,请重新输入")
continue
# 列表排序
self.student_list.sort(key=cmpfun, reverse=sort_choise_bool)
# 保存到文件
self.save_student()
# 展示结果
self.show_student()
input("请输入任意键继续...")
break
def total_student(self):
print(len(self.student_list))
def show_student(self):
print('学号\t\t姓名\t\t性别\t\t英语成绩\t\tpython成绩\t\t总成绩')
for i in self.student_list:
print(f"{i.id}\t\t{i.name}\t\t{i.gender}\t\t{i.english}\t\t{i.python}\t\t{i.total}")
@staticmethod
def show_menu():
print("====================学生信息管理系统===================")
print("------------------------功能菜单---------------------")
print(" 1.录入学生信息 ")
print(" 2.删除学生信息 ")
print(" 3.修改学生信息 ")
print(" 4.查询学生信息 ")
print(" 5.排序学生信息 ")
print(" 6.统计学生人数 ")
print(" 7.显示学生信息 ")
print("------------------------0.退出----------------------")
def load_student(self):
global f
#尝试以r打开文件,如果文件不存在则以w创建文件
try:
f = open('student.data', 'r')
except:
f = open('student.data', 'w')
else:
data = f.read()# 类型为str
'''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
转换数据类型为列表'''
new_list = eval(data)# 类型为list
#存储到学生列表中
self.student_list = [Student(i['id'],
i['name'],
i['gender'],
i['english'],
i['python']) for i in new_list]
finally:
f.close()
def save_student(self):
with open("student.data", "w") as fp:
'''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
写入数据不能是学生对象的内存地址,需要把学生数据类型转化为列表字典数据再储存'''
new_list = [i.__dict__ for i in self.student_list]
#需要转化为str类型
fp.write(str(new_list))
初学者,见识浅陋,请多指教。