项目-学生信息管理系统

一、功能简介

项目路径:D:\Study\Python\NewFight\studentsystem

项目文件:studentsystem.py、students.txt

逻辑说明:入口main(),打印选项0-7,分别对应方法逻辑:

0)退出逻辑

1)insert()录入信息,补充函数save()用来保存信息。

2)search()查找信息

3)delete()删除信息

4)modify()修改信息

5)sort()排序

6)total()统计总数

7)show()显示信息,补充方法show_student(studentList)用来显示学生信息

二、代码

1、整体代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re,os
filename="students.txt"

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)#数值进行int转换
            if option_int==0:#退出系统
                print("您已退出学生信息管理系统!")
                ctrl = False
            if 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()
def menu():
    print('''
    -------------------学生信息管理系统------------------
    |                                                    |
    |      ======== 功能菜单 ========                    |
    |        1.录入学生信息                                |
    |        2.查找学生信息                                |
    |        3.删除学生信息                                |
    |        4.修改学生信息                                |
    |        5.排序                                        |
    |        6.统计学生总人数                            |
    |        7.显示所有学生信息                            |
    |        0.退出系统                                    |
    |       ===========================                    |
    |        说明:通过数字或↑↓方向键选择菜单            |
    -----------------------------------------------------
    ''')

def insert():#1
    studentList =[]#保存学生信息的列表
    mark = True#是否继续添加
    while mark:
        id=input("请输入ID(如 1001):")
        if not id:#id为空,跳出循环
            break
        name=input("请输入名字:")
        if not name:#name为空,跳出循环
            break
        try:
            english=int(input("请输入英语成绩:"))
            python=int(input("请输入Python成绩:"))
            c=int(input("请输入C语言成绩:"))
        except:
            print("输入无效,不是整型数值,重新录入信息")
            continue
        #将学生信息添加到字典
        student={"id":id,"name":name,"english":english,"python":python,"c":c}
        studentList.append(student)#将学生字典添加到列表
        inputMark =input("是否继续添加?(y/n):")
        if inputMark =="y":#继续添加
            mark=True
        else:#不继续添加
            mark=False
    save(studentList)#将学生信息保存到文件
    print("学生信息录入完毕")

def search():#2
    mark=True
    student_query=[]#保存查询信息的学生列表
    while mark:
        id=""
        name=""
        if os.path.exists(filename):#判断文件是否存在
            mode=input("按ID输入1;按姓名输入2:")
            if mode=="1":#按id查询
                id=input("请输入学生ID:")
            elif mode=="2":#按name查询
                name=input("请输入学生姓名:")
            else:
                print("您的而输入有误,请重新输入!")
                search()#重新查询
            with open(filename,'r',encoding="utf-8") 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 "":#判断是否按name查询
                        if d["name"]==name:
                            student_query.append(d)#将查找到的学生信息保存到列表中
                show_studnet(student_query)#显示查询结果
                student_query.clear()#清空列表
                inputMark=input("是否继续查询?(y/n?):")
                if inputMark=="y":
                    mark=True
                else:
                    mark=False
        else:
            print("暂未保存数据...")
            return
def delete():#3
    mark=True #标记是否循环
    while mark:
        studentId=input("请输入要删除的学生ID:")
        if studentId is not "":#判断是否输入要删除的学生
            if os.path.exists(filename):#判断文件是否存在
                with open(filename,'r',encoding="utf-8") as rfile:#打开文件
                    student_old=rfile.readlines()#读取全部内容
            else:
                student_old=[]
            ifdel=False #标记是否删除
            if student_old:#如果存在学生信息
                with open(filename,'w',encoding="utf-8") 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 #退出删除学生信息功能
def modify():#4
    show() #显示全部学生信息
    if os.path.exists(filename):#判断文件是否存在
        with open(filename,'r',encoding="utf-8") as rfile:#打开文件
            student_old=rfile.readlines()#读取全部内容
    else:
        return
    studentid=input("请输入要修改的学生ID:")
    with open(filename,"w",encoding="utf-8") as wfile:#以只写方式打开文件
        for student in student_old:
            d=dict(eval(student))#字符串转字典
            if d["id"]==studentid:#是否为要修改的学生
                print("找到了这名学生,可以修改他的信息!")
                while True:#输入要修改的信息
                    try:
                        d["name"]=input("请输入姓名:")
                        d["english"]=input("请输入英语成绩:")
                        d["python"]=input("请输入Python成绩:")
                        d["c"]=input("请输入C语言成绩:")
                    except:
                        print("您的输入有误,请重新输入。")
                    else:
                        break#跳出环节
                    student=str(d)#将字典转为字符串
                    wfile.write(student+"\n")#将修改的信息写入文件
                    print("修改成功!")
                else:
                    wfile.write(student)#将未修改的信息写入文件
    mark=input("是否继续修改其他学生信息?(y/n):")
    if mark=="y":
        modify()#重新执行修改操作
def sort():#5
    show()#显示全部学生信息
    if os.path.exists(filename):#判断文件是否存在
        with open(filename,'r',encoding="utf-8") 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("请选择排序方式(1按英语成绩排序;2按Python成绩排序;3按C语言成绩排序;0按总成绩排序):")
    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_studnet(student_new)#显示排序结果
def total():#6
    if os.path.exists(filename):#判断文件是否存在
        with open(filename,'r',encoding='UTF-8') as rfile:#打开文件
            student_old=rfile.readlines() #读取全部内容
            if student_old:
                print("一共有%d名学生!"%len(student_old))#统计学生人数
            else:
                print("还没录入学生信息")
    else:
        print("暂未保存数据信息...")
def show():#7
    student_new=[]
    if os.path.exists(filename):#判断文件是否存在
        with open(filename,'r' ,encoding='UTF-8') as rfile:#打开文件
            student_old=rfile.readlines()#读取全部内容
        for list in student_old:
            student_new.append(eval(list))#将找到的学生信息保存到列表中
        if student_new:
            show_studnet(student_new)
        else:
            print("暂未保存数据信息")
#将保存的再列表中的血神信息显示出来
def show_studnet(studentList):
    if not studentList:#如果没有要显示的数据
        print("无数据\n")
        return
    #定义标题显示格式
    format_title="{0:^6}{1:^12}\t{2:^8}\t{3:^10}\t{4:^10}\t{5:^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(int(info.get("english")) + int(info.get("python")) + int(info.get("c"))).center(12)))
#将学生信息保存到文件
def save(student):
    try:
        students_txt =open(filename,"a",encoding="utf-8")#以追加模式打开
    except Exception as e:
        students_txt=open(filename,"w",encoding="utf-8")#文件不存在,创建文件并打开
    for info in student:
        students_txt.write(str(info)+"\n")#按行存储,添加换行符
    students_txt.close()#关闭文件

if __name__ == "__main__":
    main()
整体代码

2、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)#数值进行int转换
            if option_int==0:#退出系统
                print("您已退出学生信息管理系统!")
                ctrl = False
            if 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()

3、menu()

def menu():
    print('''
    -------------------学生信息管理系统------------------
    |                                                    |
    |      ======== 功能菜单 ========                    |
    |        1.录入学生信息                                |
    |        2.查找学生信息                                |
    |        3.删除学生信息                                |
    |        4.修改学生信息                                |
    |        5.排序                                        |
    |        6.统计学生总人数                            |
    |        7.显示所有学生信息                            |
    |        0.退出系统                                    |
    |       ===========================                    |
    |        说明:通过数字或↑↓方向键选择菜单            |
    -----------------------------------------------------
    ''')

4、insert()

def insert():#1
    studentList =[]#保存学生信息的列表
    mark = True#是否继续添加
    while mark:
        id=input("请输入ID(如 1001):")
        if not id:#id为空,跳出循环
            break
        name=input("请输入名字:")
        if not name:#name为空,跳出循环
            break
        try:
            english=int(input("请输入英语成绩:"))
            python=int(input("请输入Python成绩:"))
            c=int(input("请输入C语言成绩:"))
        except:
            print("输入无效,不是整型数值,重新录入信息")
            continue
        #将学生信息添加到字典
        student={"id":id,"name":name,"english":english,"python":python,"c":c}
        studentList.append(student)#将学生字典添加到列表
        inputMark =input("是否继续添加?(y/n):")
        if inputMark =="y":#继续添加
            mark=True
        else:#不继续添加
            mark=False
    save(studentList)#将学生信息保存到文件
    print("学生信息录入完毕")

5、search()

def search():#2
    mark=True
    student_query=[]#保存查询信息的学生列表
    while mark:
        id=""
        name=""
        if os.path.exists(filename):#判断文件是否存在
            mode=input("按ID输入1;按姓名输入2:")
            if mode=="1":#按id查询
                id=input("请输入学生ID:")
            elif mode=="2":#按name查询
                name=input("请输入学生姓名:")
            else:
                print("您的而输入有误,请重新输入!")
                search()#重新查询
            with open(filename,'r',encoding="utf-8") 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 "":#判断是否按name查询
                        if d["name"]==name:
                            student_query.append(d)#将查找到的学生信息保存到列表中
                show_studnet(student_query)#显示查询结果
                student_query.clear()#清空列表
                inputMark=input("是否继续查询?(y/n?):")
                if inputMark=="y":
                    mark=True
                else:
                    mark=False
        else:
            print("暂未保存数据...")
            return

6、delete()

def delete():#3
    mark=True #标记是否循环
    while mark:
        studentId=input("请输入要删除的学生ID:")
        if studentId is not "":#判断是否输入要删除的学生
            if os.path.exists(filename):#判断文件是否存在
                with open(filename,'r',encoding="utf-8") as rfile:#打开文件
                    student_old=rfile.readlines()#读取全部内容
            else:
                student_old=[]
            ifdel=False #标记是否删除
            if student_old:#如果存在学生信息
                with open(filename,'w',encoding="utf-8") 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 #退出删除学生信息功能

7、modify()

def modify():#4
    show() #显示全部学生信息
    if os.path.exists(filename):#判断文件是否存在
        with open(filename,'r',encoding="utf-8") as rfile:#打开文件
            student_old=rfile.readlines()#读取全部内容
    else:
        return
    studentid=input("请输入要修改的学生ID:")
    with open(filename,"w",encoding="utf-8") as wfile:#以只写方式打开文件
        for student in student_old:
            d=dict(eval(student))#字符串转字典
            if d["id"]==studentid:#是否为要修改的学生
                print("找到了这名学生,可以修改他的信息!")
                while True:#输入要修改的信息
                    try:
                        d["name"]=input("请输入姓名:")
                        d["english"]=input("请输入英语成绩:")
                        d["python"]=input("请输入Python成绩:")
                        d["c"]=input("请输入C语言成绩:")
                    except:
                        print("您的输入有误,请重新输入。")
                    else:
                        break#跳出环节
                    student=str(d)#将字典转为字符串
                    wfile.write(student+"\n")#将修改的信息写入文件
                    print("修改成功!")
                else:
                    wfile.write(student)#将未修改的信息写入文件
    mark=input("是否继续修改其他学生信息?(y/n):")
    if mark=="y":
        modify()#重新执行修改操作

8、sort()

def sort():#5
    show()#显示全部学生信息
    if os.path.exists(filename):#判断文件是否存在
        with open(filename,'r',encoding="utf-8") 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("请选择排序方式(1按英语成绩排序;2按Python成绩排序;3按C语言成绩排序;0按总成绩排序):")
    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_studnet(student_new)#显示排序结果

9、total()

def total():#6
    if os.path.exists(filename):#判断文件是否存在
        with open(filename,'r',encoding='UTF-8') as rfile:#打开文件
            student_old=rfile.readlines() #读取全部内容
            if student_old:
                print("一共有%d名学生!"%len(student_old))#统计学生人数
            else:
                print("还没录入学生信息")
    else:
        print("暂未保存数据信息...")

10、show()

def show():#7
    student_new=[]
    if os.path.exists(filename):#判断文件是否存在
        with open(filename,'r' ,encoding='UTF-8') as rfile:#打开文件
            student_old=rfile.readlines()#读取全部内容
        for list in student_old:
            student_new.append(eval(list))#将找到的学生信息保存到列表中
        if student_new:
            show_studnet(student_new)
        else:
            print("暂未保存数据信息")

11、show_studnet(studentList)

#将保存的再列表中的血神信息显示出来
def show_studnet(studentList):
    if not studentList:#如果没有要显示的数据
        print("无数据\n")
        return
    #定义标题显示格式
    format_title="{0:^6}{1:^12}\t{2:^8}\t{3:^10}\t{4:^10}\t{5:^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(int(info.get("english")) + int(info.get("python")) + int(info.get("c"))).center(12)))

12、save()

#将学生信息保存到文件
def save(student):
    try:
        students_txt =open(filename,"a",encoding="utf-8")#以追加模式打开
    except Exception as e:
        students_txt=open(filename,"w",encoding="utf-8")#文件不存在,创建文件并打开
    for info in student:
        students_txt.write(str(info)+"\n")#按行存储,添加换行符
        students_txt.flush()#刷新缓存
    students_txt.close()#关闭文件

三、打包exe

1、安装Pyinstaller模块

“命令提示符”窗口下,在python路径“C:\Program User\Python\Scripts”下执行“pip installer pyinstaller” 或升级“pip installer --upgrade pyinstaller”

检测Pyinstaller模块是否安装成功:用pyinstaller --version检测是否安装成功

2、 在python路径“C:\Program User\Python\Scripts”下执行打包命令

命令为:pyinstaller -F 含绝对路径的.py文件,例如:

pyinstaller -F D:\Study\Python\NewFight\studentsystem\studentsystem.py

说明:-F表示生成一个扩展名为.exe的可执行文件。

3、打包输出的.exe文件在python路径“C:\Program User\Python\Scripts\dist”下。

 

 

posted @ 2019-11-16 19:00  航松先生  阅读(280)  评论(0)    收藏  举报