项目——学生信息管理

学生信息管理

student_management/
├── func.py
├── info.db.bak
├── info.db.dat
├── info.db.dir
├── __init__.py
├── main.py
├── __pycache__
│   ├── func.cpython-37.pyc
│   ├── __init__.cpython-37.pyc
│   ├── main.cpython-37.pyc
│   └── setting.cpython-37.pyc
└── setting.py

 

main.py

#!/usr/bin/env python
#!encoding: UTF-8
# main.py

import shelve
import sys

sys.path.append('/noon/noon/project/student_management')

from func import *
from setting import *

if __name__ == '__main__':
    db = shelve.open(filename)  # 打开数据库文件
    info()  # show menu

    while True:
        opt = input('请选择: ')
        if not opt in options:
            print('选项: ', options)
        if opt == 'q':
            print('欢迎下次再来!')
            db.close()
            break
        elif opt == '1':
            try:
                add_info(db)
            except AssertionError as err:
                print(err)
        elif opt == '2':
            show_info(db)
        elif opt == '3':
            try:
                delete_info(db)
            except AssertionError as err:
                print(err)
        elif opt == '4':
            try:
                change_info(db)
            except AssertionError as err:
                print(err)
        elif opt == '5':    
            sort_info_by_key(db)
        elif opt == '6':
            sort_info_by_key(db, reverse=True)
        elif opt == '7':
            sort_info_by_key(db, key='age')
        elif opt == '8':
            sort_info_by_key(db, key='age', reverse=True)
        elif opt == '9':
            clear_info()

 

setting.py

#!/usr/bin/env pythono
#!encoding: UTF-8
# setting.py

"""
All settings for project student management
"""

max_score = 100  # 最大成绩
max_age = 100  # 最大年龄

filename = '/home/noon/noon/project/student_management/info.db'  # 数据库文件地址

options = [str(i) for i in range(1, 10)] + ['q']  # 可使用的选项 

 

func.py

#!/usr/bin/env python
#!encoding: UTF-8
# func.py

"""
all functions necessary for project student management 
"""

from setting import *

def get(s, e, f='int'):
    "a function to get input in <type int> or <type float>"
    while True:
        try:
            n = float(input(s))
        except:
            print(e)
            continue
        else:
            if f == 'int':
                return int(n)
            return n

def info():
    'menu'
    print('+', '-'*50, '+', sep='')
    line = lambda s: print('|', s, '|', sep='')
    line(' 1) 添加学生信息' + ' '*34)
    line(' 2) 显示学生信息' + ' '*34)
    line(' 3) 删除学生信息' + ' '*34)
    line(' 4) 修改学生成绩' + ' '*34)
    line(' 5) 按学生成绩高-低显示学生信息' + ' '*19)
    line(' 6) 按学生成绩低-高显示学生信息' + ' '*19)
    line(' 7) 按学生年龄高-低显示学生信息' + ' '*19)
    line(' 8) 按学生年龄低-高显示学生信息' + ' '*19)
    line(' 9) 清屏' + ' '*42)
    line(' q) 退出' + ' '*42)
    print('+', '-'*50, '+', sep='')

def add_info(db):
    'func 1: add_info'
    name = input('名字: ')
    if name:
        if name in db:
            flag = input('{name}已经存在于数据库中,是否覆盖(Y/N)? '.format(name=name))
            if flag.lower() not in ['y', 'yes']:
                return 
        age = get(s='年龄: ', e='请输入int数据类型!')
        assert 1<=age<=max_age, '年龄必须在1~{max_age}岁区间。'.format(max_age=max_age)
        score = get(f='float', s='成绩: ', e='请输入float数据类型!')
        assert 0<=score<=max_score, '成绩必须在0~{max_score}区间。'.format(max_score=max_score)
        db[name] = dict(zip(['name', 'age', 'score'], [name, age, score]))
        print('成功添加信息{info}.'.format(info=db[name]))

def show_info(db):
    'func 2: show_info'
    for stu in db:
        print(stu)
        for k, v in db[stu].items():
            print('\t', k, '->', v)

def delete_info(db):
    'func 3: delete_info'
    name = input('名字: ')
    if name:
        assert name in db, '不存在{name}学生的信息'.format(name=name)
        flag = input('确定删除信息{name}(Y/N)?'.format(name=name))
        if flag.lower() in ['y', 'yes']:
            deleted = db[name]
            del db[name]
            print('成功删除信息{info}.'.format(info=deleted))

def change_info(db):
    'func 4: change_info'
    name = input('名字:')
    if name:
        assert name in db, '不存在{name}学生的信息'.format(name=name)
        score = get(f='float', s='成绩: ', e='请输入float数据类型!')
        assert 0<=score<=max_score, '成绩必须在0~{max_score}区间'.format(max_score=max_score)
        student = db[name]
        student['score'] = score
        db[name] = student    
        print('成功修改信息{info}.'.format(info=db[name]))

def sort_info_by_key(db, key='score', reverse=False):
    "func 5 & func 6 & func 7 & func 8: sort_info_by_key"
    keys = [db[stu][key] for stu in db]
    if reverse:
        keys.sort(reverse=True)
    else:
        keys.sort()
    done = [stu for stu in db]
    while done:
        for stu in db:
            if db[stu]['name'] not in done:
                continue
            if db[stu][key] == keys[0]:
                print(db[stu]['name'])
                for k, v in db[stu].items():
                    print('\t', k, '->', v)
                keys.pop(0)
                done.pop(done.index(db[stu]['name']))    

def clear_info():
    "func 9: clear_info"
    import os    
    os.system('clear')
    info()

 

posted @ 2019-07-16 15:49  no樂on  阅读(279)  评论(0编辑  收藏  举报