学生信息管理
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(' ', 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(' ', 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()