2022-07-31 Python项目实战1:100行代码实现学生信息管理系统

一 项目说明

昨天在b站复习Python时遇到了个小项目(引自:花了2万多买的Python教程全套,现在分享给大家,入门到精通(Python全栈开发教程)_哔哩哔哩_bilibili),要求建立一个学生信息管理系统,实现如下几个功能:

  1. 输入学生信息,即向信息管理系统中添加学生信息
  2. 查找学生信息,即输入学生的学号得到该学生的所有信息
  3. 删除学生的信息,即删除指定学生的信息
  4. 修改学生信息
  5. 排序
  6. 统计学生人数
  7. 显示所有学生信息

二 项目源码

这个学生信息管理系统还是比较好上手的,适合我这种新手。由于之前用过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:


效果展示:功能1

我们输入一个学生的信息后,系统会提示我们是否继续输入,这时候我们发现有两个楚云飞,学号相同且重名了。这不太好,我们输入n退出功能1,回到主菜单界面,然后输入4修改学生信息。
效果展示:功能1

效果展示:功能4

根据学号定位到第1个学生那里,将其学号改为2032343,名字由楚云飞改为孔捷,其他不变。


效果展示:功能4

修改后的结果如下:


修改后结果

还有其他的诸如排序、删除等功能这里不再一一展示,感兴趣的小伙伴可以下载源码运行哦。欢迎互相交流学习~

你可能感兴趣的:(2022-07-31 Python项目实战1:100行代码实现学生信息管理系统)