用户名密码锁定程序:
一、 程序要求:
1、 输入的用户名是否在错误用户名文件中,如果存在,就提示锁定用户,退出程序
2、 如果用户名密码正确,则显示欢迎信息,退出程序
3、 如果3次输入的用户名密码错误,且用户不在可认证用户名文件内,则将该用户名写入错误用户名文件中,退出程序
二、 程序流程图
三、 Readme
1、 输入用户名,判断user是否在wrong_user.txt文件中,如果在,则输出锁定信息并退出程序
2、 输入密码,通过核对用户名密码文件检查输入的用户名密码是否正确(user.txt),有三次输入用户名密码的机会,如果正确,则输出欢迎信息并退出程序
3、 核对user.txt文件,确认输入的用户名是否存在,如果存在,输出密码错误信息并退出程序
4、 将用户名写入wrong_user.txt文件并退出程序
四、 程序代码及注释
两个程序的效果一样,区别在于调用文件的方式不同,进而造成内存的使用也不同,当然,只有文件较大时才能体现,此处文件并不大,看不出差别
1、 内存充裕时,使用的程序结构
#!/usr/bin/env python
#--author lisheng--
count = 1
user = input("usernam:")
wrong1 = open("wrong_user.txt","a") #确认文件是否存在,如不存在则创建,指针在末尾
wrong1.close()
with open("wrong_user.txt",mode="r") as wrong1: #打开记录不正确用户名的文件
for wrong1_user in wrong1.readlines(): #逐条读取记录不正确用户名的文件
wrong1_user = wrong1_user.strip() #去掉字符串后的换行
if user == wrong1_user: #如果查到有这个用户名,则退出程序,输出用户锁定信息
print("user is locking!")
break
else:
with open("user.txt", mode="r") as user1: #打开已有的用户名密码文件,格式见附件
while count < 4: #限定3次密码尝试次数
password = input("password:")
real_u_p = "{u}/{p}".format(u=user, p=password) #拼接用户名密码,以便核查
user1.seek(0) #每次重新输入密码时,将文件编辑指针指向文件开头
for real_user in user1.readlines(): #逐行读取存有正确用户名密码的文件
real_user = real_user.strip() #去掉字符串后的换行
if real_u_p == real_user: #如果查到有这个用户名,则退出程序,输出用户欢迎信息
print("welcome!")
count = 4 #count赋值为4时,本循环跳出后,后续其它判断才不会继续执行
break
count += 1 #3次尝试失败后,count的值为4,这是此后其它判断执行的必要条件
if count == 4:
with open("user.txt", mode="r") as user2: #打开已有的用户名密码文件,格式见附件
for real_user1 in user2.readlines(): #逐行读取存有正确用户名密码的文件
real_user1 = real_user1.strip() #去掉字符串后的换行
if user == real_user1: #如果查到有这个用户名,则退出程序,输出密码错误信息
print("wrong password!")
break
else:
print("username and password wrong!") #不在用户名密码文件中的用户会看到该提示
print("user is locking!") #不在用户名密码文件中的用户会看到该提示
with open("wrong_user.txt", mode="a+") as wrong2: #打开记录不正确用户名的文件
wrong2.write("{u}\n".format(u=user)) #将非法用户名写入记录不正确用户名的文件中
在这里插入代码片
2、 内存不充裕时,使用的程序结构
#!/usr/bin/env python
#--author lisheng--
count = 1 #不同的赋值,决定是否执行之后的语句
n = 1
m = 1
o = 1
user = input("usernam:")
wrong1 = open("wrong_user.txt","a") #确认文件是否存在,如不存在则创建,指针在末尾
wrong1.close()
wrong1 = open("wrong_user.txt","r") #打开记录不正确用户名的文件
for wrong1_user in wrong1.readlines(): #逐条读取记录不正确用户名的文件
wrong1_user = wrong1_user.strip() #去掉字符串后的换行
if user == wrong1_user: #如果查到有这个用户名,则退出程序,输出用户锁定信息
print("user is locking!")
n = 2 #用户锁定后,n、m、o的值变为2,此步骤之后的其它判断不再执行
m = 2
o = 2
break
wrong1.close()
user1 = open("user.txt","r") #打开已有的用户名密码文件,格式见附件
if n == 1:
while count < 4: #限定3次密码尝试次数
password = input("password:")
real_u_p = "{u}/{p}".format(u=user, p=password) #拼接用户名密码,以便核查
user1.seek(0) #每次重新输入密码时,将文件编辑指针指向文件开头
for real_user in user1.readlines(): #逐行读取存有正确用户名密码的文件
real_user = real_user.strip() #去掉字符串后的换行
if real_u_p == real_user: #如果查到有这个用户名,退出程序,输出用户欢迎信息
print("welcome!")
m = 2 #输出欢迎信息后,m、o的值变为2,此步骤之后的其它判断不再执行
o = 2
count = 4 #增大count值,以便退出while循环
break
count += 1
user1.close()
user2 = open("user.txt","r") #打开已有的用户名密码文件,格式见附件
if m == 1:
for real_user1 in user2.readlines(): #逐行读取存有正确用户名密码的文件
real_user1 = real_user1.strip() #去掉字符串后的换行
if user == real_user1: #如果查到有这个用户名,则退出程序,输出密码错误信息
print("wrong password!")
o = 2 #输出密码错误信息后,o的值变为2,此步骤之后的其它判断不再执行
break
user2.close()
wrong2 = open("wrong_user.txt","a+") #打开记录不正确用户名的文件
if o == 1:
print("username and password wrong!",end=" ") #不在用户名密码文件中的用户会看到该提示
print("user is locking!") #不在用户名密码文件中的用户会看到该提示
wrong2.write("{u}\n".format(u=user)) #将非法用户名写入记录不正确用户名的文件中
wrong1.close()
在这里插入代码片
五、 附件
1、已有的用户名密码文件格式
abc/123
def/111
sss/222
ssc/333
fff/222
aab/444
abc
def
sss
ssc
aff
aab
2、文件mode模式及描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
- 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。