主界面运行效果如下:
系统设计主要功能模块:
系统开发环境:windows、Python3,8、Pycharm、以及Python内置模块os
项目目录结构:
stusystem.py完整代码:
# -*- coding: utf-8 -*-
# @Time : 2020/12/15 8:47
# @Author : hanrui
import os
#判断磁盘文件中该id的学生是否已经存在
#存在返回True,不存在返回False
def isId_exist(filename,stu_id):
is_exist = False
file = open(filename,'r')
if os.path.getsize(filename):
lst = file.readlines() #读取的每行学生信息格式:{'id': '1', 'stu_name': 'hanrui', 'english': 1.0, 'python': 1.0, 'java': 1.0}
for item in lst:
stu = dict(eval(item)) #将字符串转为字典
if stu['id'] == stu_id:
is_exist = True
return is_exist
#判断磁盘文件中该name的学生是否已经存在
#存在返回True,不存在返回False
def isName_exist(filename,stu_name):
is_exist = False
file = open(filename, 'r')
if os.path.getsize(filename):
lst = file.readlines() # 读取的每行学生信息格式:{'id': '1', 'stu_name': 'hanrui', 'english': 1.0, 'python': 1.0, 'java': 1.0}
for item in lst:
stu = dict(eval(item)) # 将字符串转为字典
if stu['stu_name'] == stu_name:
is_exist = True
return is_exist
#将学生信息写到磁盘文件中
def save(filename,string):
with open(filename,'a') as file:
file.write(string+'\n')
'''
从控制台录入学生信息,并把他们保存到磁盘文件student.txt中
学生成绩包括:学生id,学生姓名,英语成绩,python成绩和java成绩
在student.txt中以字典格式存储
'''
def insert(filename):
while True:
stu_id = input('请输入学生ID:')
# 学生id非空且学生id不存在时
if stu_id.strip() == '': # 或者if not stu_id,因为空字符串的布尔值为False
print('学生ID不可为空')
continue
if not isId_exist(filename,stu_id):
stu_name = input('请输入学生姓名:')
while stu_name.strip() == '':
stu_name = input('学生姓名不可为空,请重新输入学生姓名')
try:
english = float(input('请输入该学生英语成绩:'))
while english < 0 or english >100:
english = float(input('分数不在合理范围内,请重新输入该学生英语成绩:'))
python = float(input('请输入该学生python成绩:'))
while python < 0 or python > 100:
python = float(input('分数不在合理范围内,请重新输入该学生python成绩:'))
java = float(input('请输入该学生java成绩:'))
while java < 0 or java > 100:
java = float(input('分数不在合理范围内,请重新输入该学生java成绩:'))
except ValueError:
print('学生成绩必须是0-100之间的数字噢!')
dict = {'id':stu_id,'stu_name':stu_name,'english':english,'python':python,'java':java}
save(filename,str(dict))
choice = input('是否继续录入?(输入y或n)')
if choice == 'y' or choice == 'Y':
continue
else:
print('成功录入学生信息')
break
#学生id存在,可以选择修改该学生信息,或者继续录入其他学生
else:
choice = input('该学生已经存在,是否修改该学生信息?(输入y或n)')
if choice == 'y' or choice == 'Y':
modify(filename)
else:
choice = input('是否继续录入学生信息?(输入y或n)')
if choice == 'y' or choice == 'Y':
continue
else:
break
'''
从控制台录入学生ID或姓名,到磁盘文件中找到对应的学生信息
'''
def search(filename):
while True:
if os.path.exists(filename):
stu_search = input('请输入要查找的学生ID或学生姓名:')
stu_find = []
with open(filename,'r') as file:
lst = file.readlines()
flag = False
for item in lst:
d = dict(eval(item))
if d['id'] == stu_search or d['stu_name'] == stu_search:
flag = True
stu_find.append(item)
if flag:
show_lst(stu_find)
else:
print('很抱歉,没有查询到该学生,无数据显示。')
choice = input('是否继续查询(输入y或n)?')
if choice == 'y' or choice == 'Y':
continue
else:
break
else:
print('查询失败,学生信息文件不存在')
'''
从控制台录入学生ID,到磁盘文件中找到对应的学生信息,并将其删除
'''
def delete(filename,stu_id=None):
while True:
if stu_id == None:
stu_id = input('请输入要删除的学生ID:')
students = []
if os.path.exists(filename) and isId_exist(filename, stu_id):
with open(filename,'r',encoding='utf-8') as file:
lst = file.readlines()
for item in lst:
stu = dict(eval(item)) # 将字符串转换为字典
if stu['id'] == stu_id:
continue
else:
students.append(stu)
os.remove(filename)
for stu in students:
save(filename, str(stu))
print('删除成功,已将ID为' + stu_id + '的学生信息删除')
elif not isId_exist(filename, stu_id):
print(f'删除失败,ID为{stu_id}的学生不存在。')
elif not os.path.exists(filename):
print('删除失败,学生信息文件不存在。')
choice = input('是否继续删除学生信息?(输入y或n)')
if choice =='y' or choice == 'Y':
continue
else:
break
'''
从控制台录入学生ID,到磁盘文件中找到对应的学生信息,将其进行修改
'''
def modify(filename):
while True:
stu_id = input('请输入要修改的学生ID:')
if os.path.exists(filename) and isId_exist(filename,stu_id):
students = []
with open(filename,'r') as file:
lst = file.readlines()
for item in lst:
stu = dict(eval(item))
if stu['id'] == stu_id:
new_id = input('输入修改后的学生ID(不修改请直接回车):')
if new_id == '': #没有输入修改值,则默认不改变
new_id = stu['id']
new_name = input('输入修改后的学生姓名(不修改请直接回车):')
if new_name == '':
new_name = stu['stu_name']
try:
new_python = float(input('输入修改后的python成绩(不修改请直接回车):'))
if new_python == '':
new_python = stu['python']
while new_python < 0 or new_python > 100:
new_python = float(input('分数不在合理范围内,请重新输入该学生的python成绩:'))
new_english = float(input('输入修改后的english成绩(不修改请直接回车):'))
if new_english == '':
new_english = stu['english']
while new_english < 0 or new_english > 100:
new_english = float(input('分数不在合理范围内,请重新输入该学生的english成绩:'))
new_java = float(input('输入修改后的java成绩(不修改请直接回车):'))
if new_java == '':
new_java = stu['java']
while new_java < 0 or new_java > 100:
new_java = float(input('分数不在合理范围内,请重新输入该学生的java成绩:'))
except ValueError:
print('学生成绩必须是0-100之间的数字噢!')
continue
d = {'id':new_id,'stu_name':new_name,'english':new_english,'python':new_python,'java':new_java}
students.append(str(d))
else:
students.append(stu)
os.remove(filename)
for student in students:
save(filename,str(student))
print('修改成功,学生信息已更新')
elif not isId_exist(filename, stu_id):
print(f'修改失败,ID为{stu_id}的学生不存在。')
elif not os.path.exists(filename):
print('修改失败,学生信息文件不存在。')
choice = input('是否继续修改其他学生信息?(输入y或n)')
if choice =='y' or choice == 'Y':
continue
else:
break
'''
主要对学生信息按英语成绩、Python成绩、java成绩、总成绩进行升序或降序排序
'''
def sort(filename):
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as file:
student_list = file.readlines()
student_dict = []
#读取文件中的每一行是以字符串形式,将每一行字符串转成字典重新添加到列表中
for item in student_list:
student_dict.append(dict(eval(item)))
subject = input('按英语成绩排序请选1,按Python成绩排序请选2,按java成绩排序请选3,按总成绩排序请选4:')
asc_or_desc = input('升序请选1,降序请选2:')
if asc_or_desc =='1':
desc = False
elif asc_or_desc == '2':
desc = True
else:
print('输入有误,请重新输入')
sort(filename)
if subject == '1':
student_dict.sort(key=lambda x: float(x['english']), reverse=desc)
elif subject == '2':
student_dict.sort(key=lambda x: float(x['python']), reverse=desc)
elif subject == '3':
student_dict.sort(key=lambda x: float(x['java']), reverse=desc)
elif subject == '4':
student_dict.sort(key=lambda x: float(x['english'])+float(x['python'])+float(x['java']), reverse=desc)
else:
print('输入有误,请重新输入')
sort(filename)
student_list.clear()
for item in student_dict:
student_list.append(str(item))
show_lst(student_list)
else:
print('排序失败,学生信息文件不存在')
#统计学生信息文件中的学生总人数
def total(filename):
if os.path.exists(filename):
with open(filename,'r') as file:
lst = file.readlines()
if len(lst) == 0 :
print('还没有录入学生信息,总共有0名同学')
return
else:
print(f'总共有{len(lst)}名同学')
else :
print('学生信息文件不存在,无法统计')
#将列表中的学生信息显示
def show_lst(lst):
# 定义标题显示格式
format_title = '{:^6}\t{:^10}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
# 定义内容显示格式
format_content = '{:^6}\t{:^12}\t{:^8}\t{:^6}\t{:^24}\t{:^0}'
if len(lst) != 0 :
print(format_title.format('ID', '姓名', '英语成绩', 'Python成绩', 'Java成绩', '总成绩'))
for item in lst:
d = dict(eval(item))
print(format_content.format(d['id'],d['stu_name'],d['english'],d['python'],d['java'],d['english']+d['python']+d['java']))
else:
print('无数据显示')
#将学生信息文件student.txt中保存的所有学生信息获取并显示出来
def show_all(filename):
if os.path.exists(filename):
with open(filename, 'r') as file:
lst = file.readlines()
show_lst(lst)
else:
print('显示失败,学生信息文件不存在')
def menu():
print('==============学生信息管理系统==============')
print('------------------功能菜单------------------')
print('\t1.录入学生信息\t\t2.查找学生信息')
print('\t3.删除学生信息\t\t4.修改学生信息')
print('\t5.排序\t\t\t\t6.统计总人数')
print('\t7.显示所有学生信息\t8.退出系统')
print('-------------------------------------------')
#主函数
def main(filename):
while True:
menu() #显示菜单
try:
choice = int(input('请选择功能(输入数字1-8):'))
if choice < 1 or choice > 8:
print('输入错误,请重新输入。')
continue
elif choice == 1:
insert(filename)
elif choice == 2:
search(filename)
elif choice == 3:
delete(filename)
elif choice == 4:
modify(filename)
elif choice == 5:
sort(filename)
elif choice == 6:
total(filename)
elif choice == 7:
show_all(filename)
elif choice == 8:
answer = input('确定退出系统吗(输入y或n):')
if answer == 'y' or answer == 'Y':
print('~~~~~~~~~~~~~~感谢使用~~~~~~~~~~~~~~')
break
else:
continue
except ValueError:
print('输入错误数字,请重新输入。')
if __name__ == '__main__':
filename = 'student.txt'
open(filename,'a')
main(filename)
项目打包:
首先打开命令行安装第三方模块:pip install PyInstaller
然后使用:pyinstaller -F C:\Users\Administrator\PycharmProjects\StudentInformationManagement\stusystem.py
-F 表示只生成一个扩展名为.exe的可执行文件,后面是要打包的文件的位置
可以看到生成的exe可执行文件在C:\Users\Administrator\dist\stusystem.exe,双击运行exe文件可看到: