学生信息记录管理系统(python)


  本系统是学习python字典时的练习副产,断断续续地,弄了很长时间。期间纠结于数据组织结构对系统查询速度的影响,又花了不少时间练习和测试“用(学号, 姓名)元组为key与学号和姓名分别为key建两条记录”的差异(详见前面博文:速度比拼——字典VS列表(python))。基于速度,最终选择了后一种方式组织数据。数据以python字典存储,用pickle序列化到磁盘文件保存。


系统 主模块python代码

#!/sur/bin/nve python
# coding: utf-8

#从自定义工具中加载时间显示和菜单列印函数
from stars_moon_tools import show_time, show_h, show_menu
#从本工程工具中加载自定义输入和菜单确认函数
from students_tools import in_s, is_menu

print('\n'*2)
#打印分割线
print('﹊'*21)
#调用函数列印当前时间
print(show_time('年月日时分秒').center(36))
print('﹊'*21)
#菜单循环
while True:
    print('\n'*2)
    s = '学生信息记录管理系统'
    show_h(s, '﹌', 34)
    #调用函数列印系统菜单
    show_menu(['添加', '查询', '删除', '修改', '字段', '口令', '文本', '备份', '说明', '作者'])
    print('﹊'*21+'\n')
    #调用函数输入菜单选项
    flag = in_s('菜单选择')
    #调用函数确认菜单选项
    is_menu(flag)

数据组织结构

  编写本系统是学习python之dict练习之作业。数据以字典作为处理容器,用pickle序列化到磁盘文件保存。我想达到每个学生信息都可以用学号或姓名直接用key查询。我想到的是每个学生用学号和姓名分别为key做两条的记录(两条记录的学号和姓名的后面是完全相同的——一个以字段为key的字典): 1,'学号: {'姓名': {'性别': '男', '民族': '汉', ..., '家长电话': '153****2514'}} 2,'姓名: {'学号': {'性别': '男', '民族': '汉', ..., '家长电话': '153****2514'}}

  就在我写这个文档的时候发现:修改一下,更易于代码操作,可能查找速度也会快些(将抽时间百万记录验证速度后,重新改版)。 1,'学号: {'姓名': '张三','info': {'性别': '男', '民族': '汉', ..., '家长电话': '153****2514'}} 2,'姓名: {'学号': '600001', 'info': {'性别': '男', '民族': '汉', ..., '家长电话': '153****2514'}}】

网友提点我的结构方法: 单条学生信息记录,('600001','张三'): {'性别': '男', '民族': '汉', ..., '家长电话': '153****2514'}(谢谢“广东·叹红尘”和“秋西”)

  通过百万条学生信息记录记录(实则是分别以是1万、100万和200万,进行比拼验证)的查找,比拼速度。在平均速度上(随机查找10条记录),两种数据组织结构,无太大差异,几乎持平。但就单条记录查找来看,(学号, 姓名)元组为key,需要遍历,有快有慢,快慢相较不止一倍。但分别以学号或者姓名为key的数据组织,则相对均衡,几近平均速度。由实验可见,数据量(1w、100w、200w)大小,影响都不是很大,特别是字典,2w和400w中查找,时间几乎相等,确实让人震惊!   试验详情,见我前期CSDN博文——“速度比拼——字典VS列表”。基于此,我选择了查找速度平衡的学号或者姓名为key组织结构学生信息记录数据。


回首页

口令校验

python代码

def passwords_proving():
    '''口令校验'''
    #口令校验,有设定系统密码,校验。否则忽略
    if glob.glob("passwords.dat")!=[]:
        #读取预设口令
        passwords_data = passwords_read("passwords.dat")
    if passwords_data==[]:
        return ''
    else:
        show_tip('请输入您的%s位密码。'%len(passwords_data))
    #口令输入
    passwords = passwords_in()
    #口令加密
    passwords_list = passwords_encrypt(passwords)
    #直接比对密文列表校验
    if passwords_list!=passwords_data:
        show_tip("口令校验失败!退出系统。")
        sys.exit()

if __name__=='__main__':
    s = '◇%2s. passwords_proving(): 口令校验。'%kk
    print(s)
    kk += 1

  一个系统,设置登录口令是必要的,于是做了个通过ord()、chr()简单加密解密的口令校验模块。口令字符以单个加密字符为元素的密文列表pickle序列化到文件磁盘保存。如无磁盘密文文件或口令设置为''(空),登录时不进入校验界面,口令不为'',提示输入口令字符数。   校验口令不解密,以同样的方式加密输入的口令,直接比对密文列表(我感觉这样子好像更安全)。


回首页

“口令”模块
口令模块菜单

  “口令”菜单下,可以对口令进行“修改”和“查看”操作。进入“口令”菜单与进入系统一样,要校验口令。


系统菜单显示
系统菜单界面

  制作菜单界面,我对细节显示调节感觉有些繁琐,费时。因而将调整好的菜单做成了一个模板def show_menu(list),list为菜单列表(不含“退出”),模板会list.append()“退出”,依次双列显示菜单列表项,方便下次弄类似菜单。

菜单显示python代码
def show_menu(menu_list):
    """系统菜单显示"""
    
    print('\n')
    s = "0. "+menu_list[0]
    #左菜单位置变量
    lm = 18-len(s)
    #追加"退出"菜单到列表
    menu_list.append("退出")
    flag = 1
    for i in menu_list:

        k = menu_list.index(i)+1
        if k==len(menu_list): k = 0
        #菜单项格式字符串
        s = "%d. %s"%(k, i)
        #菜单序号偶数,不换行
        if flag==0:
            print(" "*4+s, "\n")
            flag = 1
        #菜单序号奇数数,换行
        elif flag==1:
            print(" "*lm+s, end="")
            flag = 0
    print("\n")             

if __name__=="__main__":
    s = '◇%2s. show_menu(menu_list):菜单显示'%kk
    print(s)
    kk += 1

回首页

“字段”模块

python 代码

def keys_edit():
    '''字段处理'''
    print('\n'*2)
    print('【字段编辑】'.center(36))
    print('\n')
    keys_info = st.get('字段')
    if keys_info is None:
        keys_info = []
    def show_keys(s):
        '''字段打印'''
        print('\n'+' '*8+'%s字段:\n'%s)
        #字段为空,返回。
        if keys_info is None:
            show_tip('字段为空。')
            return ''
        k = 1
        for i in keys_info:
            print(' '*12+'%2s. %s'%(k, i))
            k += 1
    
    #显示原有字段
    show_keys('当前')
    #打印分割线
    print('﹊'*21)
    while True:
        print('\n')
        print('1. 修改  2. 插入  3. 追加  4. 删除  0. 返回'.center(36))
        print('﹊'*21) 
        flag = in_s('选择字段编辑方式')
        if flag not in ('1', '2', '3', '4', '0'):
            show_tip('输入错误!')
            continue
        else:
            break
    if flag=='0':
        return ''
    while True:
        #追加字段,不用选择字段序号
        if flag=='3':
            #防止后续语句int(order)报错,给order赋任意数字字符
            order = '1'
            break
        order = input(' '*12+'选择字段序号:').strip()
        if order.isdigit()!=True or int(order) not in	range(1, len(keys_info)+1):
            show_tip('输入错误!')
            continue
        else:
            break
    order = int(order)
    if flag=='1':
        old_key = keys_info[order-1]
        keys_info[order-1] = in_s('输入修改字段')
        show_tip('字段“%s”已成功修改为“%s”!'%(old_key, keys_info[order-1]))
    elif flag=='2':
        keys_info.insert(order-1, in_s('输入插入字段'))
        show_tip('字段“%s”已成功插入!'%keys_info[order-1])
    elif flag=='3':
        keys_info.append(in_s('输入追加字段'))
        show_tip('字段“%s”已成功追加!'%keys_info[len(keys_info)-1])
    elif flag=='4':
        del_s = keys_info[order-1]
        keys_info.pop(order-1)
        show_tip('字段“%s”已成功删除!'%del_s)
    #显示当前字段
    show_keys('编辑后')
    show_tip('◇ 字段编辑完成 ◇')
    #编辑后的字段保存
    st['字段'] = keys_info
    #调用函数保存
    save_data() 

if __name__=='__main__':
    s = '◇%2s. keys_edit(): 字段编辑模块。'%kk
    print(s)
    kk += 1
字段编辑模块

  如果学生信息记录管理系统的操作者不能对学生信息记录字段进行编辑,那么这就是一个“铁核桃”。对于学生信息记录项的更改,还要用到代码层面,相当不便,这不是我想要的结果。基于这个想法就有了这个字段模块,可以对字段进行“修改”“插入”“追加”“删除”操作。最初,字段内容我是序列化到文件磁盘保存的,每次操作都得从文件读取。后来发现,把字段内容列表优化到了学生信息记录字典中('字段': ['性别', '民族', ..., '家长电话']),与字典一起在系统运行时即随字典读入内存,方便、安全。


回首页

“添加”模块

  学生信息记录的新增模块。输入学号时,对学号的格式进行检查(数字位数和范围),不合规范报错并中断添加操作返回主菜单。输入“姓名”可以是任意字符串,检索字典中是否已有该输入字符串为key的记录,有则重新输入,直到不重名(但不能为''(空),为''返回)。

学生信息添加模块 学生信息记录添加模块

“查询”模块

  “查询”模块,对输入学号或者姓名进行查找。找到列印,找不到打印错误提示后返回主菜单。

学生信息记录查询——姓名 学生信息记录查询——学号

“删除”模块

  “删除”模块,对输入的学号或者姓名进行查找,找到列印并让用户确认删除,不确认返回。找不到打印错误提示并返回。

删除学生信息记录 学生信息记录删除

回首页

“修改”模块

   “修改”模块,对查找到的记录按序列印,选择相应序号修改相应项。对学号的修改,一样要检查是否规范和重复,对姓名修改要检查重复。其他字段的修改相应简单,直接修改即可。不选择序号,返回主菜单。   修改的实现:找到记录,读取内容到变量,修改变量后,确认修改,删除原有的字典记录,修改后的记录存入字典,序列化到文件磁盘保存。

学生信息记录修改

“备份”模块

  用os.system()作为容器来执行Linux命令,备份数据文件和恢复。

备份恢复备份恢复

“文本”模块

  “文本”模块,将学生信息记录以学号为序,逐条将记录以utf-8码格式写入students.txt,每条记录一行。

学生信息记录导出文本 学生信息记录导出文本 学生信息记录导出文本

“说明”模块

  “说明”模块,列印本文档内容。


“作者”模块
作者信息

  “作者”模块,打印作者信息。请大家指正、探讨。
  如有必要,请联系我。


回首页

系统工具列表自定义函数
系统工具列表

程序调试环境

QpythonH3Zero Termux app 图标
python 3.9.7

  安卓手机,QpythonH3编辑器编辑代码,Zero Termux下python 3.9.7调试通过。


回首页

上一篇 <<  本文 >> 下篇待续

“学生信息记录管理系统”源码

百度网盘链接:https://pan.baidu.com/s/1pkooadboqaWvPPd9eYw1QA
提取码:5v95

(说明:解压全部文件到同一目录,直接当前目录点击main.py或命令行python main.py即可。代码创建的学生信息记录信息和口令都是磁盘文件保存在当前目录。)

老齐漫画头像

精品文章:

来源:老齐教室


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值