目标要求: 1、最多输入3次用户名密码, 2、如果是被锁用户,则一次即退出程序, 3、如果输入正确的用户名密码,则提示登陆成功,程序结束, 4、3次输入不对,会将用户写入被锁用户列表,当然,该用户名需要是在注册用户列表中的。
目标要求:
1、最多输入3次用户名密码,
2、如果是被锁用户,则一次即退出程序,
3、如果输入正确的用户名密码,则提示登陆成功,程序结束,
4、3次输入不对,会将用户写入被锁用户列表,当然,该用户名需要是在注册用户列表中的。
实现用到的知识:
1、函数定义,将验证用户是否是被锁用户、用户名密码是否匹配、以及将用户加入被锁列表定义为3个独立函数
2、文件打开读写,以读r、追加a方式打开,然后用readline和readlines两种方式读取,并对取出的字符串进行strip和split处理,再比对,用write写入,最后记得close
碰到的问题:
1、中文文件读取乱码的问题
首先建立的utf-8编码的txt文件,输入了中文内容,采用的python3,一开始使用open(文件名,"r")来打开文件读取,出现乱码问题。按理说python3默认unicode,txt文件也是utf-8保存的,用的pycharm编辑工具进行了utf-8 coding的设置,各处都是一致的,没道理读出来是乱码。后来在pycharm工具中打开了txt文件,却发现该文件是ascii码,于是另存为。。。考虑到txt文件可能不会特别注意到coding方式,所以在open中显式指定encoding,问题解决。
2、该程序没能解决一种登陆情况
程序原本的要求,用户输入3次,错误的话,就锁用户。一般情况,大家只知道自己的用户名,只会对自己的一个用户名进行登陆操作,那么输错3次,该用户名被锁,ok,正常。另一种情况,3次输入的是不同的用户名(可能用户没记住注册的是哪个名字),那么3次输错后,只能锁定最后一次输入的用户名,而该用户名可能只被尝试输错了一次。
1 import getpass
2 import os
3 print("***此程序用于验证用户登录。***")
4 print("***用户最多可输入3次用户名和密码。***")
5 print("***输入正确,有提示,不用输满3次,同一个用户名输入错误3次,会被锁***\n\n")
6
7 def checklock(name,lockfile):
8 fd=open(lockfile,'r',encoding="utf-8")
9 lockusername = fd.readlines()
10 maxidx = len(lockusername) - 1
11 i = 0
12 while i <= maxidx:
13 if name == lockusername[i].strip("\n"):
14 print("用户被锁,请联系管理员")
15 fd.close()
16 return True
17 i+=1
18 fd.close()
19 return False
20
21 def checkmatch(name,password,userfile):
22 fd=open(userfile,'r',encoding="utf-8")
23 line=fd.readline()
24 while line:
25 linedate = line.strip("\n").split(" ")
26 line=fd.readline()
27 if name == linedate[0] and password == linedate[1]:
28 print("用户名密码正确,登陆成功。")
29 fd.close()
30 return True
31 print("用户名密码不正确。")
32 fd.close()
33 return False
34
35 def addlockuser(name,userfile,userlockfile):
36 fd1=open(userfile,"r",encoding="utf-8")
37 fd2=open(userlockfile, "a", encoding="utf-8")
38 line=fd1.readline()
39 while line:
40 linedate=line.split(" ")
41 line=fd1.readline()
42 if name==linedate[0]:
43 fd2.write(name+"\n")
44 print(name+"被加入被锁用户列表")
45 return
46 fd1.close()
47 fd2.close()
48
49 trynum=1
50 while trynum<=3:
51 #获得用户输入的用户名和密码
52 print("第"+str(trynum)+"次输入。\n")
53 trynum +=1
54 name=input("Username: ")
55 password=input("Password: ")
56 #password=getpass.getpass("Password: ") #需要在cmd的python解释器下运行,pycharm不能模拟
57
58 #判断输入的用户名是否在被锁用户列表中
59 if checklock(name,"lockuser.txt"):
60 exit()
61 #判断是否和存储的用户名密码匹配
62 elif checkmatch(name,password,"user.txt"):
63 exit()
64 elif trynum==4:
65 #3次输入不对,加入被锁用户文件
66 addlockuser(name,"user.txt","lockuser.txt")
67 exit()