python 实现学生管理系统
需要实现的几个基本功能
# 1.菜单展示
# 2.增删改查
# 3.本地保存读取
上代码
# -*- coding: utf-8 -*-
# @Date : 2019-12-21 12:41:25
# @Author : Flying Hu (1152598046@qq.com)
# @Link : http://www.flyinghu.cn
# @name : 学生信息管理系统
# @Version : 0.1
import json
import os
import time
# 1.菜单展示
# 2.增删改查
# 3.本地保存读取
class Student(object):
'''学生类'''
def __init__(self, name: str, age: 'int > 0', sex: str):
'''初始化学生
Args:
name 学生姓名
age 学生年龄
sex 学生性别
'''
self.name = name
self.age = age
self.sex = sex
def to_dict(self):
return {'name': self.name, 'age': self.age, 'sex': self.sex}
def __str__(self) -> str:
return '%-8s%-8d%-8s' % (self.name, self.age, self.sex)
class ManageStudent(object):
'''学生管理类'''
# 单例设计
__instance = None
def __new__(cls):
'''判断是否已经实例化'''
if cls.__instance is None:
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self, students: list = []):
''''''
self.students = students
def __str__(self) -> str:
return '学生总数: %d' % len(self.students)
def add(self, student: Student) -> None:
'''添加学生'''
self.students.append(student)
def search(self, name: str) -> Student:
'''根据姓名查询学生
Args:
name 查询学生的姓名
Returns:
student 查询到的学生对象
'''
for student in self.students:
if student.name == name:
return student
else:
return None
def insert(self, index: 'int >= 0', student: Student) -> None:
'''插入学生'''
self.students.insert(index, student)
def insert_by_name(self, name: str, in_student: Student) -> bool:
'''根据姓名插入学生'''
# 1.先查询学生
for i, student in enumerate(self.students):
if student.name == name:
self.students.insert(i + 1, in_student)
return True
else:
return False
def delete(self, name: str) -> bool:
'''根据姓名删除学生'''
for student in self.students:
if student.name == name:
self.students.remove(student)
return True
else:
return False
def update(self, name: str, up_student: Student) -> bool:
'''根据姓名更新信息'''
for i, student in enumerate(self.students):
if student.name == name:
self.students[i] = up_student
return True
else:
return False
class SMS(object):
'''学生管理系统'''
def __init__(self, file: str = './students.json'):
self.file = file
self.manage = ManageStudent()
self.load()
def load(self):
'''加载本地文件'''
try:
with open(self.file, 'r', encoding='utf-8') as f:
students = json.load(f)['students']
self.manage.students = [Student(student['name'], student['age'], student['sex']) for student in students]
except Exception:
self.manage.students = []
def save(self):
'''保存学生信息到本地文件中'''
with open(self.file, 'w', encoding='utf-8') as f:
json.dump({'students': [student.to_dict() for student in self.manage.students], 'save_time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}, f, ensure_ascii=False)
def print_main_menu(self):
self.menu_info = '''+-----------------------+
∣ 1)添加学生信息 ∣
∣ 2)显示所有学生 ∣
∣ 3)删除学生信息 ∣
∣ 4)修改学生信息 ∣
∣ 5)重置信息修改 ∣
∣ 6)保存学生信息 ∣
∣ 退出: 其他任意按键<回车> ∣
+-----------------------+'''
print(self.menu_info)
def get_option(self, option_str: str) -> int:
try:
option = int(option_str)
except Exception:
option = 0
return option
def run(self):
# 定义flag, 用来跳出多层循环
flag = True
while flag:
self.cls()
self.print_main_menu()
option_str = input()
option = self.get_option(option_str)
if option == 1:
# 添加学生信息
while flag:
self.cls()
print('*' * 20)
print('1) 在最后添加')
print('2) 在指定索引添加')
print('3) 在指定学生后添加')
print('4) 回到主菜单')
print('退出: 其他任意按键<回车>')
print('*' * 20)
option_str = input()
option = self.get_option(option_str)
if option == 4:
# 回到主菜单
break
elif option not in [1, 2, 3]:
# 退出
flag = False
continue
# 三种添加方式都要先创建学生对象
while True:
self.cls()
input_str = input(
'请输入学生的姓名 年龄 性别(使用","号隔开) <0:返回上一级>:')
if input_str == '0':
break
try:
name, age, sex = input_str.split(',', 2)
except Exception:
input_str = input(
'输入信息有误, 请重新输入, 按回车键继续 <0:返回上一级>')
if input_str == '0':
break
continue
# 判断输入
if len(name) > 10:
# 判断姓名长度是否小于10
input('输入学生姓名过长, 请重新输入, 按回车键继续')
continue
if not (age.isdigit() and 0 < int(age) < 50):
# 判断输入年龄是否为整数并且小于50大于0
input('输入学生年龄有误, 请重新输入, 按回车键继续')
continue
if sex not in ['男', '女']:
# 判断性别输入是否正确
input('输入学生年龄有误, 请重新输入, 按回车键继续')
continue
# 输入都合理, 创建学生对象
student = Student(name, int(age), sex)
break
# 判断选择的添加方式
self.cls()
if option == 1:
# 直接添加
self.manage.add(student)
print('添加成功')
elif option == 2:
# 在指定索引添加
while True:
input_str = input('输入添加位置索引: ')
if input_str.isdigit():
self.manage.insert(int(input_str), student)
print('添加成功')
break
else:
input_str = input(
'输入有误, 请重新输入, 按回车键继续: <0:返回上一级>')
if input_str == '0':
print('添加失败')
break
continue
elif option == 3:
# 在指定姓名后添加
while True:
self.cls()
name = input('输入插入位置学生姓名: ')
if len(name) > 10:
# 判断姓名长度是否小于10
input_str = input(
'输入学生姓名过长, 请重新输入, 按回车键继续: <0:返回上一级>')
if input_str == '0':
print('添加失败')
break
continue
if self.manage.insert_by_name(name, student):
print('添加成功')
break
else:
print('添加失败, 按回车键重新输入插入位置: <0:返回上一级>')
if input_str == '0':
print('添加失败')
break
continue
print('*' * 20)
print('1) 继续添加')
print('2) 回到主菜单')
print('退出: 其他任意按键<回车>')
print('*' * 20)
option_str = input()
option = self.get_option(option_str)
if option == 1:
continue
elif option == 2:
break
else:
flag = False
continue
elif option == 2:
self.cls()
# 显示所有学生
print('*' * 50)
print('序号 姓名 年龄 性别')
for i, student in enumerate(self.manage.students):
print('%-4d\t%-4s\t%-4d\t%-4s' % (i+1, student.name, student.age, student.sex))
print('*' * 50)
input('按回车键回到主菜单')
elif option == 3:
# 删除学生信息
self.cls()
while flag:
name = input('请输入需要删除学生的姓名:')
if self.manage.delete(name):
print(f'删除[{name}] 的信息成功')
else:
print(f'删除失败, 未找到[name] 的信息')
print('*' * 20)
print('1) 继续删除')
print('2) 回到主菜单')
print('退出: 其他任意按键<回车>')
print('*' * 20)
option_str = input()
option = self.get_option(option_str)
self.cls()
if option == 1:
continue
elif option == 2:
break
else:
flag = False
continue
elif option == 4:
while flag:
self.cls()
# 修改学生信息
input_str = input('请输入学生的姓名 年龄 性别(使用","号隔开) <0:返回上一级>:')
if input_str == '0':
break
try:
name, age, sex = input_str.split(',', 2)
except Exception:
input_str = input('输入信息有误, 请重新输入, 按回车键继续 <0:返回上一级>')
if input_str == '0':
break
continue
# 判断输入
if len(name) > 10:
# 判断姓名长度是否小于10
input('输入学生姓名过长, 请重新输入, 按回车键继续')
continue
if not (age.isdigit() and 0 < int(age) < 50):
# 判断输入年龄是否为整数并且小于50大于0
input('输入学生年龄有误, 请重新输入, 按回车键继续')
continue
if sex not in ['男', '女']:
# 判断性别输入是否正确
input('输入学生年龄有误, 请重新输入, 按回车键继续')
continue
# 输入都合理, 创建学生对象
student = Student(name, int(age), sex)
self.cls()
if self.manage.update(name, student):
print('修改成功')
else:
print('修改失败')
print('*' * 20)
print('1) 继续修改')
print('2) 回到主菜单')
print('退出: 其他任意按键<回车>')
print('*' * 20)
option_str = input()
option = self.get_option(option_str)
if option == 1:
continue
elif option == 2:
break
else:
flag = False
continue
elif option == 5:
# 重置信息修改
self.cls()
self.load()
input('重置成功, 输入任意键重启应用')
continue
elif option == 6:
# 保存学生信息
self.cls()
self.save()
input('保存成功, 输入任意键回到主菜单')
continue
else:
# 退出
flag = False
continue
print('退出程序')
self.quit()
def cls(self):
'''清空控制台输出'''
os.system('cls')
def quit(self):
'''退出程序'''
# 退出程序自动保存
self.save()
if __name__ == "__main__":
s = SMS()
s.run()
代码下载地址
StuInfoMS.py–>https://download.youkuaiyun.com/download/flyinghu123/12045535