python之学生信息系统管理

Python之学生信息管理系统

小白学习python总会感觉有些迷茫,我就是其中之一,最近在B站看了一个关于python入门的视频(链接在这里),其中的学生信息管理系统可谓对了我这个小白的胃口,在这里跟大家分享一下。

python之学生信息系统管理_第1张图片
先打出主菜单,这个没什么好说的 内联代码片

def menu():
    print("=========================学生信息管理系统============================")
    print("----------------------------功能菜单-----------------------------")
    print("                      1.录入学生信息")
    print("                      2.查找学生信息")
    print("                      3.删除学生信息")
    print("                      4.修改学生信息")
    print("                      5.排序")
    print("                      6.统计学生总人数")
    print("                      7.显示所有学生信息")
    print("                      0.退出")
    print("                      y = yes, n = no")
    print("-----------------------------------------------------------------")

按照主菜单的提示,在main函数的定义对应的函数内联代码片

def main():
    while True:
        menu()
        chioce = int(input("请选择"))
        if chioce in range(0,8):
            if chioce == 0 :
                ans = input("您确定要退出系统吗?")
                if ans == 'y' or ans == 'Y':
                    print("谢谢使用")
                    break     #退出系统
                else:
                    continue
            elif chioce == 1:
                insert()  #录入学生信息
            elif chioce == 2:
                search()  #查找学生信息,下面以此类推
            elif chioce == 3:
                delete()
            elif chioce == 4:
                modify()
            elif chioce == 5:
                sort()
            elif chioce == 6:
                total()
            elif chioce == 7:
                show()

python之学生信息系统管理_第2张图片
filename是储存学生信息的文本文件,os(pycharm自带)在后面会用到,用来查看文件是否存在 内联代码片

import os
filename = 'stu.txt'

以下的函数我不分特定顺序的依次给出,先看insert()–录入学生信息内联代码片

def insert():
    studentlist = []
    while True:
        id = input("请输入id(如1001):")
        if not id:    #利用布尔值直接判断
            break
        name = input("请输入姓名:")
        if not name:
            break

        try:
            eng = int(input("请输入英语成绩:"))    #类型的转换
            python = int(input("请输入python成绩:"))
            java = int(input("请输入java成绩:"))
        except:
            print("输入的成绩无效!!")
            print("请确保是整数")    #上面都转化为了int
            continue   #回到上一个循环--while True
        #将录入的学生信息保存到字典中
        student = {"id":id,"name":name,"eng":eng,"python":python,"java":java}
        studentlist.append(student)   #将该学生的信息添加到list中
        ans = input("是否继续添加?y/n\n")   #询问用户是否还需要录入信息
        if ans == 'y' :
            continue
        else :
            break
        #现在进行储存--save
    save(studentlist)
    print("学生信息录入完毕")

保存在文件中,注意’encoding=‘一定要写,否则报错。说到文件,本题 多次运用到寻找–with open文件 内联代码片

def save(list):
    try:
        stu_txt = open(filename,'a',encoding='utf-8')      #最后的这个防止中文乱码
    except:
        stu_txt = open(filename,'w',encoding='utf-8')
        pass
    for item in list:
        stu_txt.write(str(item)+'\n')    #写入并且转化成str
    stu_txt.close()      #最后关闭文件

搜索学生信息的函数 内联代码片

def search():
    student_q = []
    while True:
        id = ''
        name = ''
        if os.path.exists(filename):
            mode = input("从id查找(1)还是从姓名查找(2)?")   #注意输入的是str
            if mode == '1' :
                id = input("请输入要查询的学生的id:")
            elif mode == '2':
                name = input("请输入要查询的学生的姓名:")
            else:
                print("输入不正确,请重新输入!")
                search()      #重新调用自己这个函数,回到第一步,在此处相当于continue
            with open(filename,'r',encoding='utf-8') as rfile :
                student = rfile.readlines()      #这个程序都是--读取然后遍历,还需要转化为dict
                for item in student:
                    d = dict(eval(item))
                    if id !='':
                        if d['id'] == id:
                            student_q.append(d)

                    elif name !='':
                        if d['name'] == name:
                            student_q.append(d)
            show_stu(student_q)
            #清空列表student_q
            student_q.clear()
            ans = input("是否要继续查询?y/n\n")
            if ans == 'y' or ans == 'Y':
                continue    #回到while True
            else:
                break
        else:
            print("暂未查询到学生信息")
            return

删除信息的函数,这里我没有在每个必要的地方都加上try excption,所以输入一些无关的int会报错 内联代码片

def delete():
    while True:
        student_id = input("请输入要删除的学生的id")
        if student_id != '':
            if os.path.exists(filename):
                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:     #这里千万注意:encoding=一定要写,否则报错
                    d = {}
                    for item in student_old:
                        d = dict(eval(item))   #遍历出的是str,需要化为字典才能与原文件对应
                        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   #直接退出while True
            show()    #重新显示学生信息
            ans = input("是否继续删除?y/n\n")
            if ans == 'y' or ans == '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 #直接结束函数
    student_id  = input("请输入要修改的学生的id")
    with  open(filename,'w',encoding='utf-8') as wfile:
        for item in student_old:
            d = dict(eval(item))
            if d['id'] == student_id:
                print("已找到改学生信息,现在可以修改学生信息了")
                while True:
                    try :
                        d['name'] = input("请输入学生的姓名:")
                        d['eng'] = input("请输入英语成绩:")
                        d['python'] = input("请输入python成绩:")
                        d['java'] = input("请输入java成绩:")
                    except:
                        print("输入有误,请重新输入:")
                    else:
                        break
                wfile.write(str(d)+'\n')
                print("修改成功")
            else :
                wfile.write(str(d)+'\n')
        ans = input('是否继续修改其他学生信息(若没有修改成功请检查id是否正确)?y/n\n')     #注意要是乱输的话会直接到这一步
        if ans == 'y' or ans == 'Y':
            modify()
        #这里大体上看是顺序结构,所以不需要else一样结束这个函数

排序的函数,这里不关注如何排序,而关注如何获取待排序的信息。会用到匿名函数–lambda,具体用法见本段代码,其中因为是student_new下的方法,所以里面的x写成什么都可以,x[’’]则是在字典里索引内联代码片

#python的排序相对于C语言可以说十分简单,关键在于读取所需要的文件中的信息
def sort():
    show()
    if os.path.exists(filename) : #判断文件在磁盘上是否存在
        with open(filename,'r',encoding='utf-8') as rfile:
            student_lst = rfile.readlines()
        student_new = []
        for item in student_lst:
            d = dict(eval(item))
            student_new.append(d)
    else:
        return
    choice = input("请选择:升序(0)降序(1)")
    if choice == '0' :
        cbool = False    #这里的cbool的真假是为了与列表的sort方法的reverse保持一致
    elif choice == '1':
        cbool = True
    else:
        print("输入有误,请重新输入")
        sort()
    mode = input("请选择排序方式:1-英语成绩 2-python成绩 3-Java成绩 0-总成绩排序")
    if mode == '1':
        student_new.sort(key=lambda x : int(x['eng']),reverse=cbool)
    elif mode == '2':
        student_new.sort(key=lambda x : int(x['python']),reverse=cbool)
    elif mode == '3':
        student_new.sort(key=lambda x : int(x['java']),reverse=cbool)
    elif mode == '0':
        student_new.sort(key=lambda x : int(x['eng']) + int(x['java']) + int(x['python']),reverse=cbool)
    else:
        print("请重新选择")
        sort()       #这种方式在程序不大时比较方便,但是一旦程序较大会使得程序反复从初始位置开始,用户体验不佳
    show_stu(student_new)

统计总数 内联代码片

def total():
    #统计学生人数的实质是统计列表长度,此处只是最简单的统计,没有考虑如:学生信息重复等问题
    if os.path.exists(filename):
        with open(filename,'r',encoding='utf-8') as rfile:
            student = rfile.readlines()
            if student :   #布尔运算
                print(f'--------一共有{len(student)}名学生---------')
            else:
                print("还没有录入学生信息")


    else:
        print("暂未找到相应的文件")

上面有一个show_stu还没定义 内联代码片

def show_stu(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成绩','总成绩'))
    format_data ='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
    for item in lst:
        print(format_data.format(item.get('id'),
                                 item.get('name'),
                                 item.get('eng'),
                                 item.get('python'),
                                 item.get('java'),
                                 int(item.get('eng'))+int(item.get('java'))+int(item.get('python'))))   #括号看不清了,写出多列方便观察

在show函数中可以调用show_stu,不必再定义内联代码片

def show():
    student_lst = []
    if os.path.exists(filename):
        with open(filename,'r',encoding='utf-8') as rfile:
            students = rfile.readlines()
            for item in students:
                student_lst.append(eval(item))
            if student_lst:
                show_stu(student_lst)   #单个的可以在这里用,参数是列表,会返回列表的对应表格

    else:
        print("还未创建文件,请先保存文件")

最后写上下面的代码就可以用了(可以在python 3.9中运行) 内联代码片

if __name__ == '__main__':
    main()      

你可能感兴趣的:(小项目,python)