@第一周作业要求:编写登录接口
编写登录接口:
一、输入用户名和密码
二、认证成功后显示欢迎信息
三、输错三次后锁定
备注:在.py路径下创建文件1和2,文件1是放置用户密码的,文件2是被锁定的用户信息
(1)创建两个文件,文件1放置正确的用户名和密码,文件2用来存储被锁定的用户名信息。
(2)输入用户名和密码后先校验用户名是否在文件2中:
~如果在直接提示用户信息被锁定;
~如果不在,校验用户名是否在文件1中:
~如果不在文件1中,提示用户信息不存在;
~如果在文件1中,验证输入的密码是否和存储的相同。
(3)校验用户名和密码是否和文件1相同:
~用户名√,密码√——提示欢迎信息;
~用户名√,密码×——提示密码错误;
用户名×——提示用户信息不存在;
(4)3次账户信息或密码都输错,则锁定最后一次输入的账户,写入文件2。
(5)3次中只要有一次账户和密码输入正确,则不进行下面的继续输入操作了。(也就是不一定是输入3次整。)
ps:代码很垃圾,是实现一段功能,再写一段功能,然后再组合起来的,所以很乱,时间上断断续续也花费了总共有5个小时吧(一直在修改问题,调试,修改问题)但是最后代码也没写全。
print("*****第一次的代码*****")
error_count = 0
while error_count < 3:
file_userName = open('1.txt')
username = input("please inpur your username: ")
password = input("please input your password: ")
#判定用户的账户是否是被锁定,调取文件2,进行遍历
with open('2.txt') as i:
for row in i:
rows = row.rsplit()
if rows[0] == username:
print('Your account has been locked')
continue
#对用户的账户进行3次输入限定,判定用户名和密码是否一致
with file_userName as file_obj:
for line in file_obj:
lines = line.rsplit()
if lines[0] == username and lines[1] == password:
print("welcome to the world......")
break
elif lines[0] == username and lines[1] != password:
print("Your password_message is error!! Please check it.")
continue
elif lines[0] != username and lines[1] == password :
print("the username is not exist.")
print(lines[0],lines[1],username,password)
break
else:
continue
error_count = error_count + 1
file_userName.close()
#如果输入超过3次将被锁定该账号,即写入文件2中。
else:
print('you are died')
file_warning = open('2.txt',"a")
file_warning.write(username+"\n")
file_warning.close()
代码目前存在问题有
一、不论第3次用户名是否输入正确,都会把第三次的用户名写入锁定文件中,即文件2.txt
二、当用户名在锁定文件中,然后密码又正确,将会执行两次语句,也就是打印出:
Your account has been locked
welcome to the world…
即走了判断是否锁定代码,又走了判定用户名和密码是否正确流程
三、考虑到了用户账号和密码都不存在的情况,但是不知道这个如何实现。在if-else中。
'''
编写登录接口:
1.输入用户名和密码登录
2.输错三次锁定账户
3.下次登录还是上次的账户,提示锁定,直接退出(用到文件读写)
4.成功 后显示登录成功
'''
#lock定义为锁定文件
lock = "E:/Python_learn/day1/lock"
#account定义为账户文件
account = "E:/Python_learn/day1/account"
#计数器
count = 0
#标识器
flag = 1
#定义锁定用户列表为空
lock_user = []
#打开锁定文件,并读取锁定账户
f1 = open(lock,'r')
lock_file = f1.readlines()
f1.close()
#循环锁定账户,将账户追加到lock_user列表中
for i in lock_file:
i = i.strip('\n')
lock_user.append(i)
#打开账户文件,并读取用户和密码
f2 = open(account,'r')
account_file = f2.readlines()
f2.close()
while True:
name = input("input your name:")
passwd = input("input your password:")
#如果输入的账户在锁定用户列表中,退出循环;
if name in lock_user:
print("user is lock!")
break
else:
#否则计数器加count+1
count += 1
#如果count大于2,也就是输错三次
if count > 2:
print("错误三次")
#将账户添加到锁定账户中
with open(lock,'a') as f:
f.write("\n" + name)
break
#如果count小于2,
else:
#循环输入的用户名和密码,是否和账户文件里边的一样
for i in account_file:
n1,p1 = i.strip().split()
if name == n1 and passwd == p1:
print("welcome login!!")
#如果账户密码一样,flag标识为True
flag = True
#如果输入账户密码和文件存储的不一样,则跳出本次循环
else:
#跳出本次循环
continue
#如果flag标识为True,退出整个循环
if flag is True:
break
根据网上的例子优化自己的代码,因为网上的例子并没有提示语句,所以在这个方面我优化后的代码更人性化。但是还有一点未实现,就是当用户名和密码都错的时候,如何提示该用户不存在??(头疼。。。。。)
'''
编写登录接口:
一、输入用户名和密码
二、认证成功后显示欢迎信息
三、输错三次后锁定
author:jiaxiuxiu
备注:在.py路径下创建文件1和2,文件1是放置用户密码的,文件2是被锁定的用户信息
'''
print("*****优化后的代码*****")
error_count = 0
#为了用户名和密码都在正确的情况下,直接跳出循环,不必每次都输入整3次。
flag = 1
#创建一个列表,把锁定的用户名全部放到列表中进行下面的比对
lock_user = []
f1 = open('2.txt')
lock_file = f1.readlines()
f1.close()
#把读取到的文件内容存储在列表中,并且以strip('\n'):移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
for i in lock_file:
i = i.strip('\n')
lock_user.append(i)
#对用户的账户进行3次输入限定,判定用户名和密码是否一致
while error_count < 3:
file_userName = open('1.txt')
username = input("please inpur your username: ")
password = input("please input your password: ")
#判定输入的用户是否在锁定的文件中
if username in lock_user:
print('Your account has been locked')
break
else:
#不是锁定的用户,则直接进行密码和用户账户校验逻辑
#遍历用户密码文件,逐条对比是否满足情况:
# 1账户和密码都对,提示欢迎 2账户对密码错,提示密码错误 3账户错密码对,提示账户不存在 4账户和密码都错,提示不存在(没有实现出来)
with file_userName as file_obj:
for line in file_obj:
lines = line.rsplit()
if lines[0] == username and lines[1] == password:
print("welcome to the world......")
flag = True
elif lines[0] == username and lines[1] != password:
print("Your password_message is error!! Please check it.")
continue
elif lines[0] != username and lines[1] == password:
print("the username is not exist.")
break
else:
continue
error_count = error_count + 1
file_userName.close()
#为了用户名和密码都在正确的情况下,直接跳出循环,不必每次都输入整3次。
if flag is True:
break
#如果输入超过3次将被锁定该账号,即写入文件2中。
else:
print('you are died')
file_warning = open('2.txt',"a")
file_warning.write(username+"\n")
file_warning.close()
还有一点未实现,就是当用户名和密码都错的时候,如何提示该用户不存在??
因为在代码中遍历是逐条进行遍历的,如图中所示,当username = user2 password = 222222(正确的密码),但是遍历到user1 1111111时,就会提示the username is not exist.所以不能这么写,但是具体怎么实现呢,还未想出来,后面会继续解决。
小声bb:能不能也用文件2的方式呢,把文件用Readlines读取出来,放到列表中,或者整理为字典呢,因此部分还没学到,后面继续补充
文件1中存储的正确用户和密码如下图
一、Python2 和Python3的输入方法不同:
Python2 —— raw_input() python3 —— input()
二、打开文件后,记得关闭文件,否则报错 open()、 close()
三、读写的文件注意和.py路径相同,或者标明完整路径地址。
四、优化前的代码相同的账户会重复锁定
五、还有一点值得注意,
~优化前:无论第三次输入的用户和密码是否正确,都会被锁定,且会重复锁定。
~优化后:第三次输入的用户和密码错误的话,且已经是锁定的用户的话,将不会再次锁定,因为代码中有(break),可直接跳出循环。