作业一:登陆认证 基础需求: 让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后退出程序 升级需求: 可以支持多个用户登录 (提示,通过列表存多个账户信息) 用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里)
版本一:
# -*- coding:utf-8 -*-
# author: heimu
import os
user_dic = {"heimu_1":"111111","heimu_2":"222222","heimu_3":"333333"}
lock_state = [] # 存储黑名单
count = 1
first_input_user = None # 记录第一次输入的账户名
is_same_user = True # 标志位,用于判断三次输入的用户名是否相同
if os.path.isfile("lock_state.txt"): # 如果文件存在则打开文件
with open("lock_state.txt","r") as f: # 使用with语句,省去了每次得手动关闭文件
for line in f: # 迭代f文件,line循环一次表示一行
lock_state.append(line.strip()) # .strip 表示取出空格换行符之类的
# 主函数
while count <= 3:
user_name_input = input("please input user name: ")
passwords_input = input("please input six digital passwords: ")
if user_name_input in lock_state: # 如果账户存在于黑名单,直接退出
exit("Sorry,%s account has been locked" % user_name_input)
if not first_input_user: # 如果为None,代表为第一次输入账户
first_input_user = user_name_input
if first_input_user != user_name_input: # 代表本次输入的用户名和第一次用户名不一样
is_same_user = False # 标志位设置为False,表示不再执行账户锁定操作
if user_name_input in user_dic and user_dic[user_name_input] == passwords_input:
print("Welcome!%s" % user_name_input) # 登陆成功
break
else:
print("Authentication failure! Please input again.") # 失败错误少于三次,打印认证失败语句
count+=1
else:
print("You have failed three times,the program is going to exit !!!")
if is_same_user: # 锁定用户
if user_name_input in user_dic: # 如果账户名存在于文件中,把账户名加入黑名单
print("%s账户已经锁定" % user_name_input)
with open("lock_state.txt","a") as f:
f.write(user_name_input+'\n')
else:
pass # 如果账户名不在文件中,就算重复三次也不加入黑名单
版本二:
学生作业如下:
#coding = utf-8
import datetimetoday=datetime.date.today() #读取当前日期
password = {} #创建字典
passwd = open('user_file.txt','r') #以只读的模式打开,确保文件存在,否则报错
for f in passwd.readlines(): #读取文件的全部内容
u = f.split('\n')[0] #以回车为分割取出用户名
p = f.split('\n')[0] #以回车为分割取出密码
m = p.split('\n')[0] #以回车为分割符,取出密码的完整内容
password[p] = m
#print (password)
passwd.close()
lock = {}
user = {}
lock_info = open('lock_file.txt','r') #以只读的模式打开
user_info = open('user_file.txt','r') #以只读的模式打开
for i in lock_info.readlines():
k1 = i.split('\n')[0]
lock[k1]=k1
for u in user_info.readlines():
n=u.split('\n')[0]
user[n]=n
#print (lock)
#print (user)
count = 0
lock_info.close()
user_info.close()
username = input("请输入您的用户名:")
if username in lock.keys():
print ("该用户已被锁定,无法正常登录!")
elif username in user.keys():
pwd = input("请输入您的密码:")
if pwd == password[username]:
welcome="""
-----------Welcome info----------
登录成功!
欢迎您:%s,今天是:%s.
---------------End--------------
"""%(username,today)
print(welcome)
else:
while count < 2:
pwd = input("密码错误,请重新输入:")
if pwd == password[username]:
welcome="""
-----------Welcome info----------
登录成功!
欢迎您:%s,今天是:%s.
---------------End--------------
"""%(username,today)
print(welcome)
break
count+=1
else:
lock_user = open("lock_file.txt",'a') #将被锁定的用户名追加写入lock_file.txt文件中
lock_user.write(username+'\n')
lock_user.close()
print ("您的密码输入错误超过三次,用户被锁定!")
else:
print("无效的用户名,系统退出!")
exit()
导师批注:
1、写代码一定要多注意代码的书写规范,多参阅pep8规范文档;
2、对用户输入的数据,应对首尾空格进行处理;
3、文件操作时,应指定字符编码格式(不同的操作系统,会出现字符编码错误);
在做这份作业时,也是刚学的python编程,看老师提供的视频教程,python编程从入门到实践这本书,在遇到老师所讲的或者自己在书上看到的不太明白的知识点时,就自己到网上诸如博客园之类的去寻找帮助,看看别人对于一个方法是怎么去使用,或者为了实现一个功能是用哪个方法比较好,诸如该如何去实现文件的读写操作,这是在视频教程里还没讲到的内容,但作业里需要用到,那这就要求我必须提前去学习文件的读写操作是如何实现的。
在做这份作业时我的重点也全都是放在了该如何去做出作业所要求实现的功能,对于其它如导师所提到的pep8编码规范则是从未听说也从未看到过,在看到导师批注后去认真的把这个pep8编码规范看了一遍,原来并不是说我们写完代码后不报错、能正常运行、可以实现所需要的功能就OK了,原来代码编写的背后还有这么个规范去要求我们,诸如:
空格的使用
总体原则,避免不必要的空格。
1 各种右括号前不要加空格。
2 逗号、冒号、分号前不要加空格。
3 函数的左括号前不要加空格。如Func(1)。
4 序列的左括号前不要加空格。如list[2]。
5 操作符左右各加一个空格,不要为了对齐增加空格。
6 函数默认参数使用的赋值符左右省略空格。
7 不要将多句语句写在同一行,尽管使用‘;’允许。
8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。
注释
总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!
注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。如果是短语,可以省略结束符。
1 块注释,在一段代码前增加的注释。在‘#’后加一空格。
关于文件的读写操作:
使用python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以对文件进行各种各样的操作了,根据打开方式的不同,能够执行的操作也会有相应的差异。
打开文件的方式有:r , w , a , r+ , w+ , a+ , rb , wb , ab , r+b , w+b , a+b等,默认使用的是r(只读)模式。
1、只读操作(r、rb)
pd = open('user_file.txt', mode='r', encoding='utf-8') # 以只读的模式打开,确保文件存在,否则报错
for f in pd.readlines(): # 读取文件的全部内容
u = f.split('\n')[0] # 以回车为分割取出用户名
p = f.split('\n')[0] # 以回车为分割取出密码
m = p.split('\n')[0] # 以回车为分割符,取出密码的完整内容
password[p] = m
pd.close()
需要注意的是:文件操作时,应指定字符编码格式(不同的操作系统,会出现字符编码错误),encoding表示编码集,根据文件的实际保存编码进行获取数据,对于我们而言,更多的是utf-8。
rb读取出来的数据是bytes类型,在rb模式下,不能选择encoding字符集。rb更多的是使用在读取非文本文件的时候,诸如读取MP3、图像‘视频等信息的时候就需要用到rb,因为这种数据是没有办法直接显示出来的,在实现文件的上传下载时也会用到rb。
f.readline() 是一行一行的读取数据,但是在读取出来的数据结尾处会有一个\n,这时就需要我们调用strip()方法将其去掉。
循环读取数据这种方式是很好的,每次只读取出一行内容,从而就避免了产生内存溢出的问题。
注意:读取完的文件句柄一定要关掉,使用pd.close()。
2、写模式(w、wb、a)
写的时候要注意,如果没有文件,则会自动创建文件,如果文件已经存在,则会将原文件中的内容全部删除后再将新内容写入到文件中:
lock_user = open("lock_file.txt", mode='a', encoding='utf-8') # 将被锁定的用户名追加写入lock_file.txt文件中
lock_user.write(username+'\n')
lock_user.close()
print("您的密码输入错误超过三次,用户被锁定!")
wb模式下,可以不指定打开文件的编码集,但是在写文件的时候必须将字符串转化成utf-8的bytes数据。
a 追加模式下, 写入的内容会加在结尾。
修改后的代码:
#coding = utf-8
import datetime
import os
today = datetime.date.today() # 读取当前日期
password = {} # 创建字典
pd = open('user_file.txt', mode='r', encoding='utf-8') # 以只读的模式打开,确保文件存在,否则报错
for f in pd.readlines(): # 读取文件的全部内容
u = f.split('\n')[0] # 以回车为分割取出用户名
p = f.split('\n')[0] # 以回车为分割取出密码
m = p.split('\n')[0] # 以回车为分割符,取出密码的完整内容
password[p] = m
pd.close()
lock = {}
user = {}
lock_info = open('lock_file.txt', mode='r', encoding='utf-8') # 以只读的模式打开
user_info = open('user_file.txt', mode='r', encoding='utf-8') # 以只读的模式打开
for i in lock_info.readlines():
k1 = i.split('\n')[0]
lock[k1] = k1
for u in user_info.readlines():
n = u.split('\n')[0]
user[n] = n
count = 0
lock_info.close()
user_info.close()
username = input("请输入您的用户名:").strip()
if username in lock.keys():
print("该用户已被锁定,无法正常登录!")
elif username in user.keys():
pwd = input("请输入您的密码:").strip()
if pwd == password[username]:
welcome = """
-----------Welcome info----------
登录成功!
欢迎您:%s,今天是:%s.
---------------End--------------
""" % (username, today)
print(welcome)
else:
while count < 2:
pwd = input("密码错误,请重新输入:").strip()
if pwd == password[username]:
welcome = """
-----------Welcome info----------
登录成功!
欢迎您:%s,今天是:%s.
---------------End--------------
""" % (username, today)
print(welcome)
break
count += 1
else:
lock_user = open("lock_file.txt", mode='a', encoding='utf-8') # 将被锁定的用户名追加写入lock_file.txt文件中
lock_user.write(username+'\n')
lock_user.close()
print("您的密码输入错误超过三次,用户被锁定!")
else:
print("无效的用户名,系统退出!")
exit()
#!/user/bin/python # -*- coding:utf-8 -*- # _author: wenrouge # 作业1:编写登陆认证程序 # 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 # # 升级需求: # 可以支持多个用户登录 (提示,通过列表存多个账户信息) # 用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里) import os import datetime time = datetime.date.today() user_dic = {"alex":"111111","taibai":"222222","wusir":"333333","wenrouge":"666666"} lock = {} lock_info = open('lock_file.txt', mode='r', encoding='utf-8') for i in lock_info.readlines(): k = i.split('\n')[0] lock[k] = k lock_info.close() count = 0 username = input("请输入您的用户名:").strip() if username in lock.keys(): print("该用户已被锁定了,无法正常登录!,请联系管理员解除锁定!") elif username in user_dic.keys(): pwd = input("请输入您的密码:").strip() if user_dic[username] == pwd : news = """ -----------Welcome info---------- 【%s】登录成功!我代表CCTV欢迎你。 今天是:%s. 您输入的密码是:%s ---------------End-------------- """ % (username, time, pwd) print(news) else: while count < 2: pwd = input("密码错误。注意:连续三次错误将会被锁定。请小心的重新输入密码:").strip() if user_dic[username] == pwd : news = """ -----------Welcome info---------- 【%s】登录成功!我代表CCTV欢迎你。 今天是:%s. 您输入的密码是:%s ---------------End-------------- """ % (username, time, pwd) print(news) break count += 1 else: lock_user = open("lock_file.txt", mode='a', encoding='utf-8') # 将被锁定的用户名追加写入lock_file.txt文件中 lock_user.write(username + '\n') lock_user.close() print("您的密码输入错误超过三次,用户被锁定!") else: print("你确定你的用户名正确吗?,不好意思,我好像没有发现该用户。再见!") exit() 版本二:# -*- coding:utf-8 -*- # author: heimu import os user_dic = {"heimu_1": "111111", "heimu_2": "222222", "heimu_3": "333333"} lock_state = [] # 存储黑名单 count = 1 first_input_user = None # 记录第一次输入的账户名 is_same_user = True # 标志位,用于判断三次输入的用户名是否相同 if os.path.isfile("lock_state.txt"): # 如果文件存在则打开文件 with open("lock_state.txt", "r") as f: # 使用with语句,省去了每次得手动关闭文件 for line in f: # 迭代f文件,line循环一次表示一行 lock_state.append(line.strip()) # .strip 表示取出空格换行符之类的 # 主函数 while count <= 3: user_name_input = input("please input user name: ") passwords_input = input("please input six digital passwords: ") if user_name_input in lock_state: # 如果账户存在于黑名单,直接退出 exit("Sorry,%s account has been locked" % user_name_input) if not first_input_user: # 如果为None,代表为第一次输入账户 first_input_user = user_name_input if first_input_user != user_name_input: # 代表本次输入的用户名和第一次用户名不一样 is_same_user = False # 标志位设置为False,表示不再执行账户锁定操作 if user_name_input in user_dic and user_dic[user_name_input] == passwords_input: print("Welcome!%s" % user_name_input) # 登陆成功 break else: print("Authentication failure! Please input again.") # 失败错误少于三次,打印认证失败语句 count += 1 else: print("You have failed three times,the program is going to exit !!!") if is_same_user: # 锁定用户 if user_name_input in user_dic: # 如果账户名存在于文件中,把账户名加入黑名单 print("%s账户已经锁定" % user_name_input) with open("lock_state.txt", "a") as f: f.write(user_name_input + '\n') else: pass # 如果账户名不在文件中,就算重复三次也不加入黑名单
---
转载请注明本文标题和链接:《Python第十四天 :用户登录作业》
发表评论