一 项目说明
昨天在b站复习Python时遇到了个小项目(引自:花了2万多买的Python教程全套,现在分享给大家,入门到精通(Python全栈开发教程)_哔哩哔哩_bilibili),要求建立一个学生信息管理系统,实现如下几个功能:
- 输入学生信息,即向信息管理系统中添加学生信息
- 查找学生信息,即输入学生的学号得到该学生的所有信息
- 删除学生的信息,即删除指定学生的信息
- 修改学生信息
- 排序
- 统计学生人数
- 显示所有学生信息
二 项目源码
这个学生信息管理系统还是比较好上手的,适合我这种新手。由于之前用过python的pandas库,这个项目用pandas来做很适合,因为pandas内的DataFrame数据结构可以很方便地调用内置函数实现以上大多数功能,可以使我们的代码更简洁。
由于我在代码中添加了大量注释,因此这里直接给大家上代码,里面在用到学号查找学生信息时可以另外定义一个函数,这样可以使代码更简洁,但是我一开始没这么做,后边就没有修改。感兴趣的小伙伴可以试试,总的代码量完全可以压缩到100行以内(不含注释)。
源代码:
# @author Liu XueZheng
# @project 学生信息管理系统
# @version 1.0
import time
import pandas as pd
#定义程序主函数
def menu():
while(True):
print("==========================学生信息管理系统===============================")
print("----------------------------------功能菜单----------------------------")
print('\t\t\t\t1. 输入学生信息')
print('\t\t\t\t2. 查找学生信息')
print('\t\t\t\t3. 删除学生信息')
print('\t\t\t\t4. 修改学生信息')
print('\t\t\t\t5. 排序')
print('\t\t\t\t6. 统计学生总人数')
print('\t\t\t\t7. 显示所有学生信息')
print('\t\t\t\t0. 退出系统')
num = input("请输入功能序号")
#这里引入异常处理机制,如果用户输入的数字不在0-7范围内,系统提示重新输入
#如果用户输入的不是数字,同样提示重新输入
try:
num = int(num)
if(num in [0,1,2,3,4,5,6,7]):
if num == 0:
stuExit()
elif num == 1:
#将主程序中定义的stuPd作为实参传入
stuInput()
elif num == 2:
stuLook()
elif num == 3:
stuDel()
elif num == 4:
stuModify()
elif num == 5:
stuSort()
elif num == 6:
stuStatistics()
elif num == 7:
stuShow()
else:
print("输入有误,请输入数字0-7")
time.sleep(1)
continue
except ValueError:
print("输入有误,请输入数字0-7")
time.sleep(1)
continue
break
def stuExit():
answer = str(input("您确定要退出系统吗?y/n\n"))
if answer == "Y" or answer == "y":
print("谢谢您的使用,再见!")
elif answer == "N" or answer == "n":
menu()
else:
print("输入错误,请输入y或者n")
stuExit()
time.sleep(1)
#定义输入学生信息函数,其形参是一个pandas中的DataFrame,在主程序中定义,被其他函数所调用
def stuInput():
#想要在函数内部修改外部变量,需要先声明其为全局变量,否则程序会把它当作局部变量
global stuPd
#逐个输入学生信息
while True:
#输入学生学号
stuId = input("请输入学生的学号,例如2032340\n")
#输入学生姓名
stuName = input("请输入学生的姓名\n")
#输入学生性别
stuGender = input("请输入学生的性别\n")
#输入学生的年龄
stuAge = int(input("请输入学生的年龄\n"))
#输入学生身高(cm)
stuHeight = int(input("请输入学生的身高\n"))
#将该学生的输入信息赋值到学生信息管理系统存储,即在stuPd内新增一行信息
stuPd = stuPd.append({"学号":stuId, "姓名":stuName, "性别":stuGender, "年龄":stuAge, "身高":stuHeight}, ignore_index = True) #ignore_index表示是否重建索引
print(stuPd)
#输入完毕,判断是否进行下一个学生信息的输入
answer = input("该学生信息输入完毕,是否继续输入下一个学生信息?y/n\n")
if answer == "Y" or answer == "y":
continue
elif answer == "N" or answer == "n":
break
else:
print("输入有误,系统回到主菜单")
break
menu()
#定义查找学生信息的函数,可根据学号来查找(因为姓名有可能同名)
def stuLook():
global stuPd
while True:
#输入要查询学生的学号
idForLook = int(input("请输入要查询学生的学号"))
#建立临时变量保存学号一列的信息
list1 = stuPd["学号"].to_list()
if idForLook in list1:
print("找到了, 该学生的信息如下:\n")
#得到要查找的学号在学号列表中的索引
idIndex = list1.index(idForLook)
#输出该学生的信息
print(stuPd.iloc[idIndex])
else:
print("没有查询到,请检查输入是否正确")
answer = input("是否继续查询?y/n\n")
if answer == "Y" or answer == "y":
continue
elif answer == "N" or answer == "n":
break
else:
print("输入有误,系统回到主菜单")
break
menu()
#定义删除学生信息的函数
def stuDel():
global stuPd
#同样根据学号来删除,因为学号是唯一的
while True:
#输入要删除学生的学号
idForDel = int(input("请输入要删除学生的学号"))
#建立临时变量保存学号一列的信息
list1 = stuPd["学号"].to_list()
if idForDel in list1:
print("找到了, 该学生的信息如下:\n")
#得到要删除的学号在学号列表中的索引
idIndex = list1.index(idForDel)
#输出该学生的信息
print(stuPd.iloc[idIndex])
a = input("是否删除该学生的信息?y/n\n")
if a == "Y" or a == "y":
stuPd.drop(index = idIndex, inplace = True) #这里index指定要删除的行的索引,inplace = True表示在原数据上删除
else:
break
else:
print("没有查询到待删除学生信息的学号,请检查输入是否正确")
answer = input("是否继续删除?y/n\n")
if answer == "Y" or answer == "y":
continue
elif answer == "N" or answer == "n":
break
else:
print("输入有误,系统回到主菜单")
break
menu()
#定义修改学生信息的函数,同样利用DataFrame数据结构的内置函数实现
def stuModify():
global stuPd
while True:
#前面同样要选择需要修改的学生信息的学号
idForMod = int(input("请输入要修改学生的学号"))
#建立临时变量保存学号一列的信息
list1 = stuPd["学号"].to_list()
if idForMod in list1:
print("找到了, 该学生的信息如下:\n")
#得到要修改的学号在学号列表中的索引
idIndex = list1.index(idForMod)
#输出该学生的信息
print(stuPd.iloc[idIndex])
a = input("是否修改该学生的信息?y/n\n")
if a == "Y" or a == "y":
#建立一个循环,来询问该学生的每条信息是否需要修改
for item in stuPd.columns.values:
b = input("是否需要修改该项信息:" + item + " y/n\n")
if(b == 'y' or b == 'Y'):
stuPd[item].loc[idIndex] = input("请输入修改的内容") #注意loc和iloc的不同
else:
pass
else:
break
else:
print("没有查询到待修改学生信息的学号,请检查输入是否正确")
answer = input("是否继续修改?y/n\n")
if answer == "Y" or answer == "y":
continue
elif answer == "N" or answer == "n":
break
else:
print("输入有误,系统回到主菜单")
break
menu()
#定义排序函数
def stuSort():
global stuPd
#提供两种排序模式:升序或者降序
sortMode = input("升序还是降序? 升/降\n")
#提供两种字段排序方式:身高或者年龄
sortItem = input("按照身高排序还是按照年龄排序? 身高/年龄\n")
#利用DataFrame自带的函数sort_values排序
if sortMode == '升':
ascend = True
elif sortMode == '降':
ascend = False #控制升序还是降序,False为降序
else:
print("输入错误,请重新输入")
stuSort()
if sortItem in ['身高', '年龄']:
stuPd = stuPd.sort_values(by = [sortItem], ascending = ascend)
else:
print('输入错误,请重新输入')
stuSort()
menu()
#统计当前学生总人数
def stuStatistics():
print("当前学生总人数为{}".format(len(stuPd.index.values)))
time.sleep(2)
menu()
#显示当前系统内全部信息
def stuShow():
global stuPd
print(stuPd)
time.sleep(3)
menu()
if __name__ == "__main__":
# 定义一个Dataframe变量stuPd,后续操作均在其上进行
stuPd = pd.read_excel("学生信息表.xlsx")
print('======================================================================\n')
#删除由于前一次保存多出来的一列序号
del stuPd['Unnamed: 0']
print("当前表中学生信息:\n",stuPd)
menu()
#将学生信息写入excel文件中保存,以便下次读取
stuPd.to_excel("学生信息表.xlsx")
需要注意的是,在主程序中用到了一个excel表,这个表需要我们建立好放在python文件的同一个文件夹下,命名就是"学生信息表.xlsx",实际上也可以利用try except语句来实现自动检查是否建立这个表,没有的话直接给stuPd这个变量赋空值就好了。
上边这张图展示了这个项目的文件夹,里面的stuSystem.py文件里放的是源代码,test.py是我临时建立的一个测试文件,对项目没有影响。好啦,让我们看看这个项目的运行效果吧。
三 项目效果
在运行主程序后,效果如下图。因为"学生信息表.xlsx"里有我之前保存的学生信息,因此最初打印显示了。之后就是这个学生信息管理系统的功能菜单界面,我们可以输入0-7之间的数字来实现不同的功能。
比如功能1:
我们输入一个学生的信息后,系统会提示我们是否继续输入,这时候我们发现有两个楚云飞,学号相同且重名了。这不太好,我们输入n退出功能1,回到主菜单界面,然后输入4修改学生信息。
根据学号定位到第1个学生那里,将其学号改为2032343,名字由楚云飞改为孔捷,其他不变。
修改后的结果如下:
还有其他的诸如排序、删除等功能这里不再一一展示,感兴趣的小伙伴可以下载源码运行哦。欢迎互相交流学习~