本章使用Python语言开发了一个学生信息管理系统,该系统可以帮助教师快速录入学生的信息,并且对学生的信息进行基本的增、删、改、查操作;还可以根据排序功能,宏观地看到学生成绩从高到低的排列,随时掌握学生近期的学习状态,实时地将学生的信息保存到磁盘文件中。
为了顺应互联网时代用户的获取数据需求,学生信息管理系统应该具备以下功能:
学生信息管理系统分为7大功能模块,主要包括录入学生信息模块、查找学生信息模块、删除学生信息模块、修改学生信息模块、学生成绩排名模块、统计学生总人数模块及显示全部学生信息模块。学生信息管理系统的功能结构如图1.1所示。
图1.1 系统功能结构图
在开发学生信息管理系统前,需要先了解系统的业务流程。根据学生信息管理系统的需求分析及功能结构,设计如图1.2所示的系统业务流程。
1.3.1 系统开发环境
本系统的软件开发及运行环境具体如下:
1.3.1 文件夹组织结构
学生信息管理系统的文件夹结构比较简单,只包括一个Python文件。在运行程序时,会在项目的根目录下自动创建一个名称为students.txt文件,用于保存学生信息。
学生信息管理系统的主函数main(),主要用于实现系统的主界面。在主函数main()中,调用menu()函数生成功能选择菜单,并且应用if语句控制各个子函数的调用,从而实现对学生信息的录入、查询、显示、修改、排序和统计等功能。
在设计学生信息管理系统的主函数时,先要梳理出它的业务流程和实现技术。根据学生信息管理系统主函数要实现的功能,设计出如图所示的业务流程。
运行学生信息管理系统,首先将进入主功能菜单的选择界面,在这里列出了程序中的所有功能,用户可以根据需要输入要执行功能对应的数字编号或者按下键盘上的方向键,进入对应的子功能中去。其次在menu()函数中主要使用print()函数自爱控制台输出文字和特殊字符组成的功能菜单。当用户输入功能编号或者选择相应的功能后,程序会根据用户选择的功能编号(如果是通过方向键选择的功能,程序会自动提取出对应的数字)调用不同的函数,具体数字表示的功能如表1.1所示。
编号 | 功能 |
0 | 退出系统 |
1 | 录入学生信息,调用insert()函数 |
2 | 查找学生信息,调用search()函数 |
3 | 删除学生信息,调用delete()函数 |
4 | 修改学生信息,调用modify()函数 |
5 | 对学生成绩排序,调用sort()函数 |
6 | 统计学生总人数,调用total()函数 |
7 | 显示所有学生的信息,调用show()函数 |
表1.1 菜单中的数字所表示的功能
主函数main()的实现代码如下:
def main():
ctrl = True #标记是否退出系统
while (ctrl):
menu() #显示菜单
option = input(“请选择:”) #选择菜单项
option_str = re.sub("\D","",option) #提取数字
if option_str in ['0','1','2','3','4','5','6','7']:
option_int = int(option_str)
if option_int == 0: #退出系统
print('您已退出学生信息管理系统!')
ctrl = False
elif option_int ==1: #录入学生成绩信息
insert()
elif option_int ==2: #查找学生成绩信息
search()
elif option_int ==3: #删除学生成绩信息
delete()
elif option_int ==4: #修改学生成绩信息
modify()
elif option_int ==5: #排序
sort()
elif option_int ==6: #统计学生总数
total()
elif option_int ==7: #显示所有学生信息
show()
在主函数main()中,调用menu()函数,用于显示功能菜单。他的具体代码如下:
def menu():
#输出菜单
print("'
------------------学生信息管理系统-----------------
| |
|====================功能菜单====================|
| |
| |
| 1 录入学生信息 |
| 2 查找学生信息 |
| 3 删除学生信息 |
| 4 修改学生信息 |
| 5 排序 |
| 6 统计学生总人数 |
| 7 显示所有学生信息 |
| 0 退出系统 |
| |
| |
| |
| |
| |
|=============================================== |
| |
|------------------------------------------------|
"')
在学生信息管理系统中学生信息维护模块用于维护学生信息。主要包括录入学生信息、修改学生信息和删除学生信息,这些学生信息会保存到磁盘文件。其中,当用户在功能选择界面中输入数字“1”(或者使用方向键选择“1录入学生信息”菜单项),即可进入录入学生信息功能。在这里可以实现批量录入学生信息,并保存到磁盘文件中,运行效果如图所示。
当用户在功能选择界面中输入数字“3”(或者使用方向键选择“3删除学生信息”菜单项),将进入删除学生信息功能界面。在这里可以实现根据学生ID从磁盘文件中删除指定的学生信息,运行效果如图所示。
当用户在功能选择界面中输入数字“4”(或者使用方向键选择“4修改学生信息”菜单项),将进入修改学生信息功能界面。在这里可以实现根据学生ID修改指定的学生信息,运行效果如图所示。
1.功能概述
录入学生信息功能主要就是获取用户在控制台上输入的学生信息,并且把它们保存到磁盘文件中,从而达到永久保存的目的。例如,在功能菜单上输入功能编号1,并且按下
2.业务流程
在实现录入学生信息功能时,先要梳理出它的业务流程和实现技术。录入学生信息的业务流程和实现技术如图所示。
3.具体实现
(1)编写一个向文件中写入指定内容的函数,将其命名为save(),该函数有一个列表类型的参数,用于指定要写入的内容。save()函数的具体代码如下:
#将学生信息保存到文件
def save(student)
try:
student_txt = open(filename,"a") #以追加模式打开
except Exception as e:
student_txt = open(filename,"w") #文件不存在,创建文件并打开
for info in student:
student_txt.write(str(info)+"\n") #按行存储,添加换行符
student_txt.close() #关闭文件
(2)编写主函数的调用的录入学生信息的函数insert()。在该函数中,先定义一个保存学生信息的空列表,然后设置一个while循环,在该循环中通过input()函数要求用户输入学生信息(包括学生ID、名字、英语成绩、Python成绩和C语言成绩)。如果这些内容都符合要求,则将它们保存到字典中,再将该字典添加到列表中并且询问是否继续录入;如果不再录入则结束while循环,并调用save()函数,将录入的学生信息保存到文件中。insert()函数的具体代码如下:
def insert():
stdentList = [] #保存学生信息的列表
mark = True #是否继续添加
while mark:
id = input(“请输入ID(如1001):”)
if not id: #ID为空,跳出循环
break
name = input("请输入名字:")
if not name: #名字为空,跳出循环
break
try:
english = int(inpu("请输入英语成绩:"))
python = int(inpu("请输入Python成绩:"))
c = int (inpu("请输入C语言成绩:"))
except:
print("输入无效,不是整型数值....重新录入信息")
continue
#将输入的学生信息保存到字典
stdent = {"id":id,"name":name,"english":english,"python":python,"c":c}
stdentList.append(stdent) #将学生字典添加到列表中
inputMark = input("是否继续添加?(y/n):")
if inputMark == "y": #继续添加
mark = True
else: #不继续添加
mark = False
save(stdentList) #将学生信息保存到文件
print("学生信息录入完毕!!!")
(3)执行录入学生信息后,将在项目的根目录中创建一个名称为students.txt的文件,该文件中保存着学生信息。例如,输入2条信息后,students.txt文件的内容如图所示。
1.功能概述
删除学生信息功能主要就是用户在控制台上输入的学生ID,到磁盘文件中找到对应的学生信息,并将其删除。例如,在功能菜单上输入功能编号“3”,并且按下
2.业务流程
在实现删除学生信息功能时,先要梳理出它的业务流程和实现技术。根据要实现的功能,设计出如图所示的业务流程和实现技术。
3.具体实现
编写主函数中调用的删除学生信息的函数delete()。在该函数中,设置一个while循环,在该循环中,首先通过input()函数要求用户输入要删除学生ID;然后以只读模式打开保存学生信息的文件,并且读取其内容保存到一个列表中;再以写模式打开保存学生信息的文件,并且遍历保存学生信息的列表,将每个元素转换为字典,从而方便根据输入的学生ID判断是否为要删除的信息。如果不是要删除的信息,则将其重新写入到文件中。delete()函数的具体代码如下:
def delete():
mark = True #标记是否循环
while mark:
studentId = input("请输入要删除的学生ID:")
if studentId is not "": #判断是否输入要删除的学生
if os.path.exists(filename): #判断文件是否存在
with open(filename,'r') as rfile: #打开文件
student_old = rfile.readlines() #读取全部内容
else:
student_old = []
ifdel = False #标记是否删除
if student_old: #如果存在学生信息
with open(filename,'w')as wfile: #以写方式打开文件
d = {}
for list in student_old:
d= dict(eval(list)) #字符串转字典
if d['id'] != studentId:
wfile.write(str(d) + "\n") #将一条学生信息写入文件
else:
ifdel = True #标记已经删除
if ifdel:
print("ID为%s的学生信息已经被删除..." % studentId)
else:
print("没有找到ID为 %s 的学生信息..." % studentId)
else: #不存在学生信息
print("无学生信息...")
break #退出循环
show() #显示全部学生信息
inputMark = input("是否继续删除?(y/n):")
if inputMark == "y":
mark = True #继续删除
else:
mark = False #退出删除学生信息功能
1.功能概述
修改学生信息功能主要就是根据用户在控制台上输入的学生ID,从磁盘文件中找到对应的学生信息,再对其进行修改。例如,在功能菜单上输入功能编号“4”,并且按下
2.业务流程
在实现修改学生信息功能时,先要梳理出它的业务流程和实现技术。如图所示。
3.具体实现
编写主函数中调用的修改学生信息的函数modify()。在该函数中,调用show()函数显示全部学生信息,之后再判断保存学生信息的文件是否存在。如果存在,以只读模式打开文件,并且读取全部学生信息保存到列表中,否则返回。接下来提示用户输入要修改的学生ID,并且以只写模式打开文件。打开文件后,遍历保存学生信息的列表,将每个元素转换为字典,再根据输入的学生ID判断是否为要修改的信息。如果是要修改的信息,则提示用户输入新的信息,并保存到文件,否则直接将其写入文件中。modify()函数的具体代码如下:
def modify():
show() #显示全部学生信息
if os.path.exists(filename): #判断文件是否存在
with open(filename,'r') as rfile: #打开文件
student_old = rfile.readlines()
else:
return
studentid = input("请输入要修改的学生ID:")
with open(filename,"w") as wfile: #以只写模式打开文件
for student in student_old:
d = dict(eval(student)) #字符串转字典
if d["id"] == studentid: #是否为要修改的学生
print("找到了这名学生,可以修改他的信息!")
while True: #输入要修改的信息
try:
d["name"] = input("请输入姓名:")
d["english"] = int(input("请输入英语成绩:"))
d["python"] = int(input("请输入Python语言:"))
d["c"] = int(input("请输入C语言:"))
except:
print("您的输入有误,请重新输入。")
else:
break #跳出循环
student = str(d) #将字典转换为字符串
wfile.write(studnet + "\n") #将修改的信息写入到文件
print("修改成功!")
else:
wfile.write(student) #将未修改的信息写入到文件
mark = input("是否继续修改其他学生信息?(y/n):")
if mark == "y":
modify() #重新执行修改操作
在学生信息管理系统中,查询/统计模块用于查询和统计学生信息。主要包括根据学生编号或姓名查找学生信息、统计学生总人数和显示所有学生信息。在显示获取到的学生信息时,会自动计算总成绩。其中,当用户在功能选择界面中输入数字“2”或者使用方向键选择“2查找学生信息”菜单项,即可进入到查找学生信息功能。在这里可以实现根据学生编号或姓名查找学生信息,运行效果如图所示。
当用户在功能选择界面中输入数字“6”(或者使用方向键选择“6统计学生总人数”菜单项),即可进入到统计学生总人数功能。在这里可以实现统计并显示学生总人数的信息,运行效果如图所示。
当用户在功能选择界面中输入数字“7”(或者使用方向键选择“7显示所有学生信息”菜单项),即可进入到显示所有学生信息功能。在这里可以实现显示全部学生信息(包括学生的总成绩),运行效果如图所示。
1. 功能概述
查找学生信息功能主要是根据用户在控制台上输入学生ID或者姓名,到磁盘文件中找到对应的学生信息。例如,在功能菜单上输入功能编号“2”,并且按下
2. 业务流程
在实现查询学生信息功能时,先要梳理出它的业务流程和实现技术。根据要实现的功能,设计出如图所示的业务流程和实现技术。
3. 具体实现
编写主函数中调用的查找学生信息的函数search(),设置一个循环并在该循环中先判断保存学生信息的文件是否存在,如果不存在则给出提示并返回,否则提示用户选择查询方式;然后根据选择的方式到保存学生信息的文件中查找对应的学生信息,并且调用show_student()函数将查询结果进行显示。search()函数的具体代码如下:
def search():
mark = True
student_query = [] #保存查询结果的学生列表
while mark:
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() #重新查询
with open(filename,'r')as file: #打开文件
student = file.readlines() #读取全部内容
for list in student:
d = dict(eval(list)) #字符串转字典
if id is not "": #判断是否按ID查询
if d['id'] == id:
student_query.append(d) #将找到的学生信息保存到列表中
elif name is not "": #判断是否按姓名查询
if d['name'] == name:
student_query.append(d)
show_student(student_query) #显示查询结果
student_query.clear() #清空列表
inputMark = input("是否继续查询?(y/n):")
if inputMark == "y":
mark = True
else:
mark = False
else:
print("暂未保存数据信息...")
return
在上面的代码中, 调用了函数show_student(),用于按指定格式显示获取的列表。show_student()函数的具体代码如下:
#将保存的列表中的学生信息显示出来
def show_student(studentlist):
if not studentlist:
print("无数据信息\n")
return
#定义标题显示格式
format_title = "{:^6}{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^10}"
print(format_title.format("ID","名字",
"英语成绩","Python成绩","C语言成绩","总成绩"))#按指定格式显示标题
#定义具体内容显示格式
format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
for info in studentList: #通过for循环将列表中的数据全部显示出来
print(format_data.format(info.get("id"),
info.get("name"),str(info.get("english")),str(info.get("python")),
str(info.get("c")),
str(info.get("english")+info.get("python")+
info.get("c")).center(12)))
上面的代码中,使用了字符串的format()方法对其进行格式化。其中再指定字符串的显示格式时,数字表示所占宽度,符号"^"表示居中显示,“\t”表示添加一个制表符。
1. 功能概述
统计学生总人数功能主要是统计学生信息文件中保存的学生信息个数。例如,在功能菜单上选择“6统计学生人数”,并且按下
2. 业务流程
在实现统计学生总人数功能时,先要梳理出它的业务流程和实现技术,如图所示。
3. 具体实现
编写主函数中调用的统计学生总人数的函数show()。在该函数中,添加一个if语句,用于判断保存到学生信息的文件是否存在,如果存在则以只读模式打开该文件,读取该文件的全部内容后保存到一个列表中。然后再遍历该列表,并将其元素转换为字典,再添加到一个新列表中,最后再调用show_student()函数将新列表中的信息显示。show()函数的具体代码如下:
def show():
student_new = []
if os.path.exists(filename): #判断文件是否存在
with open(filename,'r') as rfile: #打开文件
student_old = rfile.readlines() #读取全部内容
for list in student_old:
studdent_new.append(eval(list)) #将找到的学生信息保存到列表中
if student_new:
show_student(student_new)
else:
print("暂存保存数据信息...")
1. 功能概述
显示所有学生信息功能主要就是将学生信息文件中保存的全部学生信息获取并显示。例如,在功能菜单上选择“7显示所有学生信息”菜单项,并且按下
2. 业务流程
在实现显示所有学生信息功能时,先要梳理出它的业务流程和实现技术,如图所示。
3. 具体实现
编写主函数中调用的统计学生总人数的函数show()。在该函数中,添加一个if语句,用于判断保存学生信息的文件是否存在,如果存在则以只读模式打开该文件,读取该文件的全部内容后保存到一个列表中。然后再遍历该列表,并将其元素转换为字典,再添加到一个新列表中,最后再调用show_student()函数将新列表中的信息显示。show()函数的具体代码如下:
def show():
student_new = []
if os.path.exists(filename): #判断文件是否存在
with open(filename,'r') as rfile: #打开文件
student_old = rfile.readlines() #读取全部内容
for list in student_old:
student _new.append(eval(list)) #将找到的学生信息保存到列表中
if student_new:
show_student(student _new)
else:
print("暂未保存数据信息...")
在学生信息管理系统中,排序模块用于对学生信息按成绩进行排序。主要包括按英语成绩、Python成绩、C语言成绩和总成绩按升序或降序排列。其中,当用户在功能选择界面中输入数字“5”,或者使用方向键选择“5排序”菜单项时,即可进入到排序功能。在这里先录入顺序显示学生信息(不排序),然后要求用户选择排序方式,并根据选择方式进行排序显示。
1. 功能概述
按学生成绩排序功能主要是对学生信息按英语成绩、Python成绩、C语言成绩或总成绩升序或降序排列。例如,输入功能编号“5”,并且按下
2. 业务流程
在实现按学生成绩排序功能时,先要梳理出它的业务流程和实现技术,如下图所示。
3. 具体实现
编写主函数中调用的排序的函数sort()。在该函数中,首先判断保存学生信息的文件是否存在,如果存在,则打开该文件读取全部学生信息,并将每一名学生信息转换为字典保存到一个新的列表中,然后获取用户输入的排序方式,再根据选择结果进行相应的排序,最后调用show_student()函数显示排序结果。sort()函数的具体代码如下:
def sort():
show()
if os.path.exists(filename):
with open(filename,'r') as file:
student_old = file.readlines()
student_new = []
for list in student_old:
d = dict(eval(list)) #字符串转字典
student_new.append(d) #将转换后的字典添加到列表中
else:
return
ascORdesc = input("请选择(0升序;1降序):")
if ascORdesc == "0": #按升序排序
ascORdescBool = False
elif ascORdesc == "1":
ascORdescBool = True #按降序排序
else:
print()
sort()
mode = input()
if mode == "1": #按英语成绩排序
student_new.sort(key=lambda x: x["english"],reverse=ascORdescBool)
elif mode == "2": #按Python成绩排序
student_new.sort(key=lambda x: x["python"],reverse=ascORdescBool)
elif mode == "3": #按C语言成绩排序
student_new.sort(key=lambda x: x["c"],reverse=ascORdescBool)
elif mode == "0": #按总成绩排序
student_new.sort(key=lambda x: x["english"]+x["python"]+x["c"],reverse=ascORdescBool)
else:
print(“您的输入有误,请重新输入!”)
sort()
show_student(student_new) #显示排序结果
上面的代码中,调用列表的sort()方法实现的排序,在排序时,通过lambda表达式指定的排序规则。例如,第22行代码中的"key=lambda x: x["english"]"表示按字典的english键进行排序;“reverse = ascORdescBool”表示是否为降序排序,标记变量ascORdescBool的值为True,表示降序排序。
Python项目完成后,可以将其打包成一个.exe可执行文件,这样就可以在其他计算机上运行该项目了,即时这台计算机上没有安装Python开发环境。
实现打包.exe可执行文件时,需要使用PyInstaller模块,该模块为第三方模块所以需要单独安装。PyInstaller模块支持多种操作系统,如Windows、Linux、Mac OS X等,但是该模块并不支持跨平台操作。例如:在Windows操作系统下打包的.exe可执行文件,该文件就只能在Windows环境下运行。
这里以Windows操作系统为例,介绍PyInstaller模块的安装,安装PyInstaller模块最简单的方法就是在“命令提示符窗口”中输入“pip install pyinstaller”命令进行安装,如图所示。如果是升级或者是更新可以使用“pip install --upgrade pyinstaller”命令。
PyInstaller模块安装完成以后,就可以打包.py文件为.exe文件了。具体方法如下。
(1)通过CMD命令打开“命令提示符”窗口,在当前光标位置输入:pyinstaller+-F+(要打包的.py文件的绝对路径),例如,该文件保存在“”目录中,则可以使用下面的代码对其打包:
pyinstaller -F E:\tmp\studentsystem\studentsystem.py
(2)输入上面的代码并按下
(3)在如图所示的位置,找到.exe文件的保存路径,并且在该路径下找到生成.exe可执行文件,双击该文件即可运行本项目。
本节主要使用Python语言开发了一个学生信息管理系统,项目的核心是对文件、列表和字典进行操作。其中,对文件进行操作是用来永久保存学生信息;而将学生信息以字典的形式存储到列表中,是为了方便对学生信息的查找、修改和删除。通过本节的学习,读者首先应该熟练并掌握对文件进行创建、打开和修改等操作的方法,其次还应该掌握对字典和列表进行操作的方法,尤其是对列表进行自定义排序规则,这是本项目的难点,需要读者仔细体会并做到融会贯通。