用python来实现简单的学生信息管理系统
1.功能介绍
2.使用步骤
3.模块介绍
4.具体代码实现
5.各模块运行效果
6.源码
一、功能介绍
含有以下功能:
0.退出系统
1.录入学生信息
2.查找学生信息
3.删除学生信息
4.修改学生信息
5.将学生进行排序
6.统计学生总人数
7.显示全部学生信息
二、使用步骤
1.开始时会显示功能界面,只要按数字选择功能即可
2.输入数字
3.按照提示操作即可
三、模块介绍
1.定义主函数:def main()
2.显示功能界面:def menu()
3.录入学生信息 :def insert():
4.查找学生信息:def search():
5.删除学生信息:def delete():
6.修改学生信息:def modify():
7.将学生进行排序:def sort():
8.统计学生总人数:def total():
9.显示全部学生信息:def show():
四、具体代码实现
五、各模块运行效果
六、源码
filename = 'student.txt'#创建文件filename用以存储学习信息
import os#导入os模块
def main(): # 定义主函数
while True: # while中的语句将被反复执行,直到条件式为False才会退出循环
menu() # 调用menu()函数
choice = int(input('请选择功能:'))
if choice in [0, 1, 2, 3, 4, 5, 6, 7]: # 总条件语句,不满足条件直接输出else
if choice == 0:
answer = input('此举动将退出系统,是否确认?y/n')
if answer == 'y' or answer == 'Y': # 确保小写和大写都被识别
print('感谢您的使用!')
break
else:
continue
elif choice == 1:
insert() # 调用insert()函数
elif choice == 2:
search() # 调用search()函数
elif choice == 3:
delete() # 调用delete()函数
elif choice == 4:
modify() # 调用modify()函数
elif choice == 5:
sort() # 调用sort()函数
elif choice == 6:
total() # 调用total()函数
elif choice == 7:
show() # 调用show()函数
else:
print('对不起,无此功能')
break
def menu(): # 定义menu()函数
print('**********************学生信息管理系统**************************')
print('--------------------------功能菜单----------------------------')
print('\t\t\t\t\t\t1.录入学生信息')
print('\t\t\t\t\t\t2.查找学生信息')
print('\t\t\t\t\t\t3.删除学生信息')
print('\t\t\t\t\t\t4.修改学生信息')
print('\t\t\t\t\t\t5.将学生信息进行排序')
print('\t\t\t\t\t\t6.统计学生总人数')
print('\t\t\t\t\t\t7.显示全部学生信息')
def insert():
student_list = []
while True:
id = input('请输入学生id:')
if not id: # 即ID的布尔值为False,比如输入了一个空字符串,那么便不满足条件式,直接break
break
name = input('请输入学生姓名:')
if not name: # 与ID一样道理
break
try: # try...except语句可以防止程序因操作失误而崩溃报错,如果程序错误,将会执行except语句,不会影响程序的运行
english = int(input('请输入学生的英语成绩:'))
python = int(input('请输入学生的python成绩:'))
java = int(input('请输入学生的java成绩:'))
except:
print('输入无效,不是int类型,请重新输入')
continue
student = {'id': id, 'name': name, 'english': english, 'python': python, 'java': java} # 将学生信息放入字典中
student_list.append(student) # 将存放信息的字典添加到列表中
answer = input('是否继续添加?y/n')
if answer == 'y':
continue
else:
break
save(student_list) # 利用save()函数保存录入的学生信息
print('学生信息录入完毕')
def save(lst): # 定义save()函数
stu_txt = open(filename, 'a', encoding='utf_8') # ’a‘为追加信息 add,encoding='utf_8'可以防止中文乱码
for item in lst:
# 如果下面语句不加\n换行,txt里的列表会挤在一起
stu_txt.write(str(item) + '\n') # 如果不对item使用str()函数,将会出现以下错误:TypeError: write() argument must be str, not dict
stu_txt.close()
def search():
student_query=[]#列表可以存储同名元素
while True:
id=''
name=''#申明id 和name
if os.path.exists(filename):#当文件存在才可运行下列语句
mode=input('按id查找请按1,按姓名查找请按2:')
if mode=='1':
id=input('请输入学生id:')
elif mode=='2':
name=input('请输入学生姓名:')
else:
print('输入有误,请重新输入:')
search()#调用search()函数,输入错误之后可以重新输入
with open(filename,'r',encoding='utf_8')as rfile:#定义一个rfile去暂时存放目标文件中信息
student=rfile.readlines()#读取数据
for item in student:#遍历student中元素
d=dict(eval(item))#创建一个字典储存student中元素
if id!='':#如果id不为空值,程序才可接着运行
if d['id']==id:#如果id与你要查找的学生id符合
student_query.append(d)#将查找的学生信息添加至新创建的列表中
elif name!='':#与id原理相同
if d['name']==name:
student_query.append(d)
show_student(student_query)#展示查询结果
student_query.clear()#第二次查找 防止列表当中有元素,所以要清空列表
answer=input('是否继续查找?')
if answer=='y':
continue
else:
print('查找完毕')
break
else:
print('暂未保存学生信息')
return
def show_student(lst):
if len(lst)==0:
print('没有查询到学生信息')
return
format_title='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'#格式,可自定义
print(format_title.format('id','姓名','英语成绩','Python成绩','java成绩','总成绩'))
formate_data='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
for item in lst:
print(formate_data.format(item.get('id'),
item.get('name'),
item.get('english'),
item.get('python'),
item.get('java'),
int(item.get('english'))+int(item.get('python'))+int(item.get('java'))
))
def delete():
while True:
student_id = input('请输入要删除学生id:')
if student_id != '': # 即不为空值
if os.path.exists(filename): # 即filename存在,那么布尔值就不会为false,程序就可以继续运行。
with open(filename, 'r', encoding='utf_8')as file:
student_old = file.readlines()#读取全部信息到列表
else:
student_old = []
flag=False#作为后方判断结构的开关 可以用来标记是否删除
if student_old:#如果列表中有元素
with open(filename,'w',encoding='utf_8') as wfile:#‘w’以只写模式进行覆盖
d={}
for item in student_old:
d=dict(eval(item))
if d['id']!=student_id:#不相等的重新写入,相等的符合条件,直接删除
wfile.write(str(d)+'\n')
else:
flag=True
if flag:
print(f'id为{student_id}的学生信息已删除')
else:
print(f'没有id为{student_id}的学生信息')
else:
print('无学生信息')
break
show()#删除之后重新显示学生信息
answer=input('是否继续删除?y/n\n')
if answer=='y'or answer=='Y':
continue
else:
break
def modify():
show()
if os.path.exists(filename):
with open(filename,'r',encoding='utf_8')as rfile:
student_old=rfile.readlines()
else:
return#RETURN 后面什么都不接表示函数运行完毕
student_id=input('请输入要修改的学员的id:')
with open(filename,'w',encoding='utf_8')as wfile:#wfile用于存储执行修改操作之后的学生信息
for item in student_old:
d=dict(eval(item))
if d['id']==student_id:
print('找到学生信息,可以修改')
while True:
try:#防止输入错误导致程序崩溃
d['name'] = input('请输入学生姓名:')
d['english'] = input('请输入英语成绩:')
d['python'] = input('请输入python成绩:')
d['java'] = input('请输入java成绩:')
except:
print('输入有误,请重新输入:')
else:
break
wfile.write(str(d)+'\n')#id符合要修改的学生的学生信息的写入
print('修改成功')
else:
wfile.write(str(d)+'\n')#虽然没有修改成功,也要写入学生信息,因为write写入会覆盖原有记录
answer=input('是否继续修改?y/n')
if answer=='y':
modify()
def sort():
show()#显示元素
student_new=[]
if os.path.exists(filename):#文件存在是前提
with open(filename,'r',encoding='utf_8')as rfile:#与前面类似
students=rfile.readlines()
for item in students:
d=dict(eval(item))
student_new.append(d)
else:
return
asc_or_desc=input('请选择排序方式,升序请按0,降序请按1')
if asc_or_desc=='0':
asc_or_desc_bool=False
elif asc_or_desc=='1':
asc_or_desc_bool=True
else:
print('您的输入有误,请重新输入')
sort()
mode=input('请选择排序方式1.按英语成绩排序,2.按python成绩排序,3.按java成绩排序,0.按总成绩排序')
if mode=='1':
student_new.sort(key=lambda x:int(x['english']),reverse=asc_or_desc_bool)#lambda语法:
elif mode=='2':
student_new.sort(key=lambda x:int(x['python']),reverse=asc_or_desc_bool)
elif mode=='3':
student_new.sort(key=lambda x:int(x['java']),reverse=asc_or_desc_bool)
elif mode=='0':
student_new.sort(key=lambda x: int(x['english'])+int(x['python'])+int(x['java']), reverse=asc_or_desc_bool)
else:
print('您的输入有误,请重新输入:')
sort()
show_student(student_new)#展示排序之后的信息
def total():
if os.path.exists(filename):
with open(filename,'r',encoding='utf_8')as rfile:
students=rfile.readlines()#读取数据
if students:#列表是否为空,不为空就继续
print(f'一共有{len(students)}名学生')#要在字符串中插入变量的值,可以在前引号前加上字母f。这种字符串名为f字符串。f是format(设置格式)的简写
else:
print('还没有录入数据')
else:
print('暂未保存数据')
def show():
student_lst=[]
if os.path.exists(filename):
with open(filename,'r',encoding='utf_8')as rfile:#以只读模式打开文件
students=rfile.readlines()#读取数据到students
for item in students:#将students中的元素遍历出来
student_lst.append(eval(item))#将item添加到列表中
if student_lst:#列表是否不为空
show_student(student_lst)
else:
print('暂无数据')
else:
print('暂未保存数据')
if __name__ == '__main__':
main()