Python Learning Journal:Day5

学生信息管理系统(python)

花了2万多买的Python教程全套,现在分享给大家,入门到精通(Python全栈开发教程) P135-145


系统需求

1、录入学生信息:控制台按提示信息输入学生信息,保存至.txt文件中
2、查找学生信息:按ID或姓名查找学生信息
3、删除学生信息:删除指定ID学生信息
4、修改学生信息:修改指定ID学生信息
5、排序学生信息:按英语、python、java成绩对学生信息进行升序、降序处理,结果显示在控制台上
6、统计学生总人数:统计文件中保存学生信息个数
7、显示所有学生信息
8、系统打包生成.exe文件


重点部分代码

输入的学生信息保存至字典中、所有学生信息保存至列表中

stu_list = []
student = {'id': id, 'name': name, 'english': english, 'python': python, 'java': java}
stu_list.append(student)

学生信息逐行保存至文件中

try…except…处理:保证文件存在时,按追加形式写入,文件不存在时,按写方式写入。
str:文件中保存字符类型

def save(stu_list):
    try:
        text = open(filename, 'a', encoding='utf-8')
    except:
        text = open(filename, 'w', encoding='utf-8')
    for item in stu_list:
        text.write(str(item) + '\n')
    text.close()

按行读取.txt文件内容

调用os.path.exits()判断是否存在filename文件,若存在,则调用上下文管理器with打开文件。
调用readlines()方法,按行读入文件内容至列表中,格式为str类型。

if os.path.exists(filename):
	with open(filename, 'r', encoding='utf-8') as text:
    stu_list = text.readlines()
else:
    stu_list = []

当item是以字典形式保存时,通过以下方式实现字符串与字典转换

item是stu_list列表元素

d = dict(eval(item))

排序方法

调用已有的sort函数,实现排序
key:排序对象,x表示stu_new_list中的元素(即学生信息字典)
reverse:排序方式,升序 or 降序,升序False,降序True

res = input('请选择(0升序1降序):')
if res == '0':
    res = False
elif res == '1':
    res = True
else:
    print('请输入正确的数字选项!')
    continue
stu_new_list.sort(key=lambda x: float(x['english']), reverse=res)

输出格式

规定位长输出

def show_all(item):
    grades = total(item)
    d = dict(eval(item))
    # 标题格式化输出
    format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
    print(format_title.format('ID', '姓名', '英语成绩', 'python成绩', 'java成绩', '总成绩'))
    # 内容格式化输出
    format_data = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
    print(format_data.format(d['id'], d['name'], d['english'], d['python'], d['java'], grades))

在这里插入图片描述
输出文字+已有变量

print(f'ID为{id}的学生信息不存在')

打包exe文件

1、anaconda prompt:
进入anaconda安装目录:由于anaconda prompt不能直接切换其他盘,因此需cd ..切换

(base) C:\Users\dell>cd ..

(base) C:\Users>cd ..

(base) C:\>d:

(base) D:\>cd anaconda3

(base) D:\anaconda3>cd Scripts

(base) D:\anaconda3\Scripts>

2、安装pyinstaller库
在anaconda prompt中输入以下命令,即可安装

(base) D:\anaconda3\Scripts>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller

3、打包exe文件
在anaconda prompt中进入目标目录,输入以下命令,即可打包至目标目录

(base) D:\>pyinstaller -F D:\pythonProject\pythonProject01\main.py

根据提示可知,exe文件在D盘dist目录下
在这里插入图片描述


全部代码(参考B站视频,链接在开头)

"""
    学生信息管理系统
    2022.01.14
    功能:输入、查询、删除、修改、排序
"""

import os
import re

filename = 'student.txt'


def main():
    while True:
        menu()
        choose = int(input())  # 输入的是字符串
        if choose == 1:
            insert()
        elif choose == 2:
            search()
        elif choose == 3:
            delete()
        elif choose == 4:
            modify()
        elif choose == 5:
            sort()
        elif choose == 6:
            total_stu()
        elif choose == 7:
            show()
        elif choose == 0:
            print('您确定要退出系统吗?y/n——')
            ans = input()
            if ans == 'y' or ans == 'Y':
                print('谢谢使用!')
                break
            else:
                continue
        else:
            continue


def insert():
    stu_list = []
    while True:
        id = input('请输入ID(如1001):')
        if len(id) == 0:  # if not id
            continue
        name = input('请输入姓名:')
        if not name:
            continue
        try:
            english = float(input('请输入英语成绩:'))
            python = float(input('请输入python成绩:'))
            java = float(input('请输入java成绩:'))
        except:
            print('输入无效,请重新输入!')
            continue
        # 将输入的学生信息保存到字典中
        student = {'id': id, 'name': name, 'english': english, 'python': python, 'java': java}
        stu_list.append(student)
        answer = input('是否继续添加学生信息?:y/n')
        if answer == 'Y' or answer == 'y':
            continue
        else:
            save(stu_list)
            return


def save(stu_list):
    try:
        text = open(filename, 'a', encoding='utf-8')
    except:
        text = open(filename, 'w', encoding='utf-8')
    for item in stu_list:
        text.write(str(item) + '\n')
    text.close()


# 按ID查询
# 按姓名查询
def search():
    while True:
        res = input('按ID查询请输入1,按姓名查询请输入2:')
        if os.path.exists(filename):
            with open(filename, 'r', encoding='utf-8') as text:
                stu_list = text.readlines()
        else:
            stu_list = []
        flag = False
        if res == '1':
            id = input('请输入学生ID:')
            for item in stu_list:
                d = dict(eval(item))
                if id != d['id']:
                    continue
                else:
                    flag = True
                    show_all(item)
            if not flag:
                print('没有查询到学生,无数据可显示')
        elif res == '2':
            newname = input('请输入学生姓名')
            for item in stu_list:
                d = dict(eval(item))
                if d['name'] != newname:
                    continue
                else:
                    flag = True
                    show_all(item)
            if not flag:
                print('没有查询到学生,无数据可显示')
        else:
            continue
        answer = input('是否继续查询?y/n')
        if answer == 'Y' or answer == 'y':
            continue
        else:
            return


# 删除学生信息(若学生不存在则需提示、若保存学生信息文件不存在则需显示)
# 展示删除后的全部学生信息
def delete():
    while True:
        id = input('请输入要删除学生的id:')
        if not id:
            continue
        if os.path.exists(filename):
            with open(filename, 'r', encoding='utf-8') as text:
                stu_old = text.readlines()  # 字符串列表
        else:
            stu_old = []
        flag = False  # 标识是否被删除/是否被找到
        if stu_old:
            with open(filename, 'w', encoding='utf-8') as newtext:  # 写覆盖
                d = {}
                for item in stu_old:
                    d = dict(eval(item))  # 将字符串转成字典
                    if d['id'] != id:
                        newtext.write(str(d) + '\n')  # 字典转换成字符串保存
                    else:
                        flag = True
                if flag:
                    print(f'id为{id}的学生信息已被删除')
                else:
                    print(f'未找到id为{id}的学生')
        else:
            print('无学生信息')
            break
        show()
        answer = input('是否继续删除?y/n')
        if answer == 'Y' or answer == 'y':
            continue
        else:
            return


def modify():
    while True:
        id = input('请输入要修改的学员ID:')
        if not id:
            continue
        flag = False
        if os.path.exists(filename):
            text = open(filename, 'r', encoding='utf-8')
            stu_list = text.readlines()
        else:
            stu_list = []
        if stu_list:
            with open(filename, 'w', encoding='utf-8') as newtext:
                for item in stu_list:
                    d = dict(eval(item))
                    if d['id'] != id:
                        newtext.write(str(d) + '\n')
                    else:
                        flag = True
                        print('找到这名学生,可以修改他的相关信息了!')
                        while True:
                            try:
                                d['name'] = input('请输入姓名:')
                                d['english'] = input('请输入英语成绩:')
                                d['python'] = input('请输入python成绩:')
                                d['java'] = input('请输入java成绩:')
                            except:
                                print('您的输入有误,请重新输入!')
                            else:
                                break
                        newtext.write(str(d) + '\n')
                if not flag:
                    print(f'ID为{id}的学生信息不存在')

        else:
            print('无学生信息')
            break
        show()
        answer = input('是否继续修改学生信息?y/n')
        if answer == 'Y' or answer == 'y':
            continue
        else:
            return


def sort():
    stu_new_list = []
    if os.path.exists(filename):
        with open(filename, 'r', encoding='utf-8') as text:
            stu_list = text.readlines()
    else:
        return
    # 标题格式化输出
    format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
    print(format_title.format('ID', '姓名', '英语成绩', 'python成绩', 'java成绩', '总成绩'))
    if stu_list:
        for item in stu_list:
            d = dict(eval(item))
            stu_new_list.append(d)
            grades = total(item)
            # 内容格式化输出
            format_data = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
            print(format_data.format(d['id'], d['name'], d['english'], d['python'], d['java'], grades))
        while True:
            res = input('请选择(0升序1降序):')
            if res == '0':
                res = False
            elif res == '1':
                res = True
            else:
                print('请输入正确的数字选项!')
                continue
            way = input('请选择排序方式(1:按英语成绩排序,2:按python成绩排序,3:按java成绩排序,0:按总成绩排序):')
            if way == '1':
                # sort排序函数:key排序对象
                # reverse:排序方式--False升序、True降序
                stu_new_list.sort(key=lambda x: float(x['english']), reverse=res)
                show_sort(stu_new_list)
            elif way == '2':
                stu_new_list.sort(key=lambda x: float(x['python']), reverse=res)
                show_sort(stu_new_list)
            elif way == '3':
                stu_new_list.sort(key=lambda x: float(x['java']), reverse=res)
                show_sort(stu_new_list)
            elif way == '0':
                stu_new_list.sort(key=lambda x: float(x['english'] + x['python'] + x['java']), reverse=res)
                show_sort(stu_new_list)
            else:
                print('请输入正确的数字选项!')
                continue
            answer = input('是否继续排序?y/n')
            if answer == 'Y' or answer == 'y':
                continue
            else:
                return
    else:
        print('暂未保存学生信息!')


def total_stu():
    if os.path.exists(filename):
        with open(filename, 'r', encoding='utf-8') as text:
            stu_list = text.readlines()
            if stu_list:
                print('一共有{}名学生'.format(len(stu_list)))
            else:
                print('还未录入学生信息!')
    else:
        print('暂未保存学生信息!')


def total(item):
    d = dict(eval(item))
    grades = float(d['python']) + float(d['english']) + float(d['java'])
    return grades


def show():
    text = open(filename, 'r', encoding='utf-8')
    stu_list = text.readlines()
    if stu_list:
        for item in stu_list:
            d = dict(eval(item))
            print('学生id为:' + d['id'] + ' 姓名:' + d['name'] + ' English:' + str(d['english']) + ' Python:' + str(
                d['python']) + ' Java:' + str(d['java']))
    else:
        print('暂未保存学生信息!')


def show_all(item):
    grades = total(item)
    d = dict(eval(item))
    # 标题格式化输出
    format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
    print(format_title.format('ID', '姓名', '英语成绩', 'python成绩', 'java成绩', '总成绩'))
    # 内容格式化输出
    format_data = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
    print(format_data.format(d['id'], d['name'], d['english'], d['python'], d['java'], grades))


def show_sort(stu_new_list):
    # 标题格式化输出
    format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
    print(format_title.format('ID', '姓名', '英语成绩', 'python成绩', 'java成绩', '总成绩'))
    for item in stu_new_list:
        # 内容格式化输出
        format_data = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'
        print(format_data.format(item['id'], item['name'], item['english'], item['python'], item['java'], item['english']+item['python']+item['java']))


def menu():
    print('--------------------学生信息管理系统--------------------')
    print('------------------------功能--------------------------')
    print('                    1.录入学生信息')
    print('                    2.查找学生信息')
    print('                    3.删除学生信息')
    print('                    4.修改学生信息')
    print('                    5.排序学生信息')
    print('                    6.统计学生总人数')
    print('                    7.显示所有学生信息')
    print('                    0.退出系统')
    print('*****************************************************')
    print('您的选择是:')


if __name__ == '__main__':
    main()

写在最后:设计系统时,一定要确立需求,再编写函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值