用户名密码锁定程序-记录错误用户名并锁定

用户名密码锁定程序:
一、 程序要求:
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+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

猜你喜欢

转载自blog.csdn.net/weixin_41772367/article/details/89075384
今日推荐