编写可供用户查询的员工信息表
Posted 头发乱刘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写可供用户查询的员工信息表相关的知识,希望对你有一定的参考价值。
编写可供用户查询的员工信息表
要求:
1.需要用户认证
2.员工信息表文件内容:
ID Name Department Phone
3.认证成功后查询正确信息
上一篇内容:https://www.cnblogs.com/easypython/p/9080561.html
〇上一篇已经实现基本要求,但代码还有所欠缺,比如登录成功后输入回车或空格会把文件信息作一次性读取出操作,而此篇内容为对上一篇的修改补充;可实现功能:
〇1.编写登录接口,输入用户名和密码
〇2.用户验证成功登录后显示登录欢迎信息
〇3.用户输错密码超限后锁定
〇4 不同的错误锁定方式可以有所区别
〇解决一次性输出文件所有信息的BUG
代码分享如下:
1 #!/usr/bin/env/python #声明解释器 2 # -*- coding: utf-8 -*- #声明使用utf-8编码,此行Python3不需要 3 import sys #导入sys模块 4 import time #导入time模块 5 6 dic_account = {} #定义一个空字典 7 normoal_file = "G:\\python\\exsise\\\\file\\whitelist.txt" #白名单文件,存放用户名与密码的本地文件,注意路径前\'\\\\\' 8 lock_file = "G:\\python\\exsise\\\\file\\lock.txt" #黑名单文件,我用的是我的本地文件存放的绝对路径 9 with open(normoal_file) as norm_f: #打开白名单文件 10 for line in norm_f.readlines(): #for循环,readlines()一次性读取所有行 11 usr,pawd = line.strip().split() #每行去除空格分割后分别赋予两个变量 12 dic_usr_pawd = {usr:pawd} #以每一行得到的两个变量为键值对就生成一个字典 13 dic_account.update(dic_usr_pawd) #循环更新扩展字典 14 15 def deny_accout(usrname): #定义了黑名单的函数 16 print(\'\\033[1;31;40m\') #下一目标输出背景为黑色,颜色红色高亮显示 17 print(\'*\' * 50) #输出打印信息 18 print(\'\\033[7;31m错误次数超限,用户已被永久锁定,请联系管理员!\\033[1;31;40m\') #字体颜色红色反白处理 19 print(\'*\' * 50) #打印50个*号 20 print(\'\\033[0m\') #屏幕输出颜色恢复默认值 21 with open(lock_file,\'a\') as deny_f: #以追加模式打开黑名单文件 22 deny_f.write(\'\\n\') #换行 23 deny_f.write(usrname) #黑名单中写入锁定用户 24 sys.exit() #执行sys模块退出方法 25 def main(): #定义主函数 26 NumOfInput = 1 #定义输入次数变量NumOfInput初始值为1 27 usr_list = [] #定义一个空列表 28 while True: #while 循环 29 usrname = input(\'\\033[1;32m请输入您的用户名:\\033[0m\') #用户交互第一步:请输入用户名 30 if list(dic_account.keys()).count(usrname) == 0: #计算输入的用户名在字典里对应键个数是否为零 31 if len(usrname.strip()) == 0: #如果输入为空 32 print(\'\\033[1;31m用户名不能为空,请重新输入\') #打印相应提示信息 33 else: #否则(既输入不为空) 34 with open(lock_file) as lock_f: #打开黑名单文件进行后一步操作 35 for line in lock_f.readlines(): #对于line在黑名单文件中的其中一行,readlines()一次性读取所有行 36 if usrname == line.strip(): #如果输入用户名等于黑名单其中一员 37 sys.exit(\'\\033[1;41m用户%s已锁定,请联系管理员。\\033[0m\' % usrname) #退出并提示用户账户已锁定 38 usr_list.append(usrname) #对列表进行附加元素操作 39 redo_num = usr_list.count(usrname) #计算列表里元素存在的为usrname个数并赋值变量,usrname引用输入的用户名变量 40 if redo_num == 3: #如果列表计算的用户名个数小于3(这里的意思为如果尝试输入的同一个用户名应小于3次) 41 deny_accout(usrname) #调用deny_accout()函数,既同一用户名输入次数超过3次加入黑名单 42 elif NumOfInput < 5 : #如果循环输入次数不超过5次 43 NumOfInput += 1 #变量每次循环自增1 44 print("\\033[1;31m出错了,用户名:%s没有找到,请重新输入:" % usrname) #打印相应的错误提示信息 45 else: #否则(输入次数超过5次) 46 print(\'\\033[1;33m用户名错误次数超限,请5分钟后再试\') #打印错误提示 47 time.sleep(300) #调取time模块方法,5分钟内无法操作 48 else: #否则(既输入的用户名在白名单中存在) 49 NumOfInput = 0 #同样赋予输入次数变量NumOfInput初始值为0 50 while NumOfInput < 3: #进入while循环,输入次数不超过3 51 passwd = input(\'\\033[1;32m请输入用户%s密码:\\033[0m\' % usrname) #输入用户名密码 52 if passwd == str(dic_account[usrname]): #如果密码与字典里对应输入用户名的键值相同 53 print(\'\\033[1;36m登陆成功。您的所有操作有可能会被记录!\') #打印登录成功信息 54 while True: #while循环 55 match_yes = 0 #定义一个变量初始值与后面的赋值对应,具有特殊意义 56 sch_input = input("\\033[1;34;42mPlease enter what the information you need to search: ") #请输入你想查找的信息 57 InfoOfEmTab_file = open("TheInfoOfEmployeeTable.txt") #对文件进行操作,打开员工信息表文件 58 while True: #嵌套while循环,目的是读取文件每一行 59 line = InfoOfEmTab_file.readline() #读取文件的一行,readline()每次读取一行 60 if len(line) == 0: break #读取到文件结尾后结束退出 61 if sch_input.strip() in line: #假如输入内容在读取文件的其中一行 62 if sch_input.strip() == \'\': #假如输入空格或者回车 63 match_yes = 1 #满足条件后给变量赋予新值(注:变量赋值不输出任何信息) 64 else: #否则 65 print("\\033[1;31mMarch Item: \\033[1;36m%s" % line) #打印匹配信息 66 match_yes = 2 #满足条件后给变量赋予新值,与初始变量值不同,所以不打印当变量值为初始值的提示信息 67 if match_yes == 0: #变量值如果等于初始值(可以理解为输入不为空或者回车,且用户输入的查找内容不在信息表的任一行) 68 print("\\033[1;31mNo match items had found!Please check it and try again.\\n") #打印变量等于初始值需要输出的提示信息 69 if match_yes == 1: #对应之前赋值\'match_yes = 1\' 70 print("\\033[1;31mThere was no character input, please check if the input was corrected!\\n ") #打印赋值为1需要输出的提示信 71 if len(passwd.strip()) == 0: #如果输入密码为空 72 print(\'\\033[1;33m密码不能为空,请重新输入,您还有%d次机会。\'% (2-NumOfInput)) #打印错误提示信息 73 NumOfInput += 1 #输入次数增加1 74 else: #否则(密码不为空而且密码不正确) 75 print(\'\\033[1;33m密码错误,请重新输入,您还有%d次机会。\'% (2-NumOfInput)) #打印密码错误提示 76 NumOfInput += 1 #输入错误次数增加1 77 else: #否则(输入次数超过3) 78 print(\'\\033[1;31m输入次数超限,请2小时后再试\') #打印错误提示 79 time.sleep(7200) #调取time模块方法,2小时内无法操作 80 81 if __name__ == \'__main__\': #当模块被直接运行时,以下代码块将被运行,当模块是被导入时,则不运行 82 main() #执行main()函数
执行效果图:
1.输入空格或回车不计算次数,其他不同用户超过5次冻结5分钟无法操作
2.输入黑名单成员直接锁定退出
3.输入同一用户名错误累计3次加入黑名单
4.输入正确用户名,密码错误3次冻结2小时无法操作
5.登陆成功后查询员工信息表,输入空格和回车提示错误信息,输入查询内容,匹配打印相关信息
以上是关于编写可供用户查询的员工信息表的主要内容,如果未能解决你的问题,请参考以下文章
finally中调用unlockWrite对写出健壮代码是很重要的