随老男孩学习python markpython
'''shell
练习程序:编写登陆接口编程
1. 输入用户名和密码编辑器
2. 认证成功后显示欢迎信息学习
3. 输错三次后锁定blog
输入三次后退出,下次一样用户名再登录就显示用户已经被锁定,用户锁定信息能够保存在硬盘文件里面,跟硬盘文件进行交互索引
不能用shell命令,只能用Python的自带的文件调用的接口(能够对文件增删改查),先学文件处理怎么弄接口
4.用户名和密码从文件里面读取,还有一个检查帐户锁定的文件three
'''ip
模拟登录系统主要练习文件的操做、条件语句、循环等
1.str.strip([chars]):
删除字符串前边和后边的全部空格,chars参数能够定制须要删除的字符,可选。
input().strip()能够去除用户输入时带入的空格,避免产生没必要要的错误。
用法:
account = input('请输入帐号:').strip()
2.str.upper()
转换字符串中的全部小写字母为大写字母
command = input('请输入指令:').strip()
if command.upper() == 'A':
add_user(database)
无论输入的指令给为A或a都会执行此项。
3.dict.get(key)
获取字典中的key对应的value,若key不存在则返回None,
if database.get(account) == None:
若是key不存在不会报错
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Author : "David J" ##未利用文件,未实现持续锁定 import sys users_list = {"jdw":"123","smz":"123"} locked_count = 0 log_error_count = 0 #登陆模块 while True: username = input("please input your username:").strip() password = input("please input your password:") #判断用户名和密码是否相同 if username in users_list.keys(): if password == users_list[username]: print("登陆成功") sys.exit() else: log_error_count += 1 if log_error_count < 3: print("用户名或密码错误,请重试!") else: locked_count = 1 print("重试超过三次,已锁定!") sys.exit() else: log_error_count += 1 if log_error_count < 3: print("用户名错误,请重试!") else: locked_count = 1 print("重试超过三次,已锁定!") sys.exit()
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Author : "David J" #登陆数据文件UserPassword.txt,实现用户三次错误后锁定 # 字典和列表的区别:列表是有顺序的,使用索引访问;而字典中的条目是用键keys来访问的 # 初始化空字典 user_dict = {} # 初始化空列表list,有了空的列表以后,程序就能够向这个列表中增长元素 user_list = [] # 用户密码错误的初始值为0 login_error_count = 0 # 使用while开始无限制的循环 while True: # 交互式输入登陆用户名和密码 logon_name = input("Pls input your username:") pass_word = input("Pls input your password:") # 读取用户登陆数据文件UserPassword.txt ''' UserPassword.txt示例 jdw,123456,0,0 smz,123456,0,0 root,123456,0,0 cslc,123456,0,0 ''' users_data = open('UserPassword.txt','r') # 循环遍历打开的数据,对打开的数据进行格式化操做,而后把格式化之后的数据保存到建立好的user_dict字典当中 for user_data in users_data: # 使用strip去除user_data数据行中的先后空格 user_list = user_data.strip() # 将去除先后空格以后的数据行user_list使用逗号进行分割,并从新保存到user_datas中 user_datas = user_list.split(',') # 将user_datas数据行中的第0个位置的数据(即用户名),去除先后空格后,赋给新的变量user_name user_name = user_datas[0].strip() # 将user_datas数据行中的第1个位置的数据(即密码),去除先后空格后,赋给新的变量user_passwd user_passwd = user_datas[1].strip() # 将user_datas数据行中的第2个位置的数据(即锁定状态,0表明未锁定,1表明锁定),去除先后空格后,赋给新的变量user_locked user_locked = user_datas[2].strip() # 将user_datas数据行中的第3个位置的数据(即密码输入错误次数),去除先后空格后,赋给新的变量user_error_count # 将user_datas[3]的数据类型强制转换为int user_error_count = int(user_datas[3].strip()) # 将前面定义好的变量信息,保存到字典中,为前面的值指定键名,即键:值对应的关系,键名能够随便起,建议考虑易读性 # 若是下面的键名出线下划波浪线,并不表明有语法错误,而是编辑器认为拼写的英文不是正确的英文单词,不影响脚本执行 # 按照Python的编程规范,在逗号和冒号后面须要加一个空格 user_dict[user_name] = {'name': user_name, 'password': user_passwd, 'locked': user_locked, 'errorcount': user_error_count} # 关闭打开的UserPassword.txt文件 users_data.close() # 判断用户帐户是否已经被锁定,将前面交互界面输入的用户名和字典里保存的用户名列进行匹配 # 将前面交互式输入的用户名和字典中的userlocked键进行匹配,若是用户名对应的键为1,就是被锁定了,退出登陆 if logon_name in user_dict.keys(): if user_dict[logon_name]['locked'] == '1': print("This user was locked,pls contact administrator!") break # 将前面输入的用户名、密码和字典中的用户名、密码进行匹配,若是成功,则输出登陆系统,而后退出 if logon_name == user_dict[logon_name]['name'] and pass_word == user_dict[logon_name]['password']: print("Welcome to System!") break else: # 若是用户名在字典里,可是密码不对,将前面输入的用户名所对应字典中的错误次数进行自增 user_dict[logon_name]['errorcount'] += 1 # 若是用户名输入正确的状况下,密码输入错误的次数小于3次,给用户从新尝试的机会 if user_dict[logon_name]['errorcount'] < 3: print("The password was wrong,pls try again,your have three chance!") # 追加写入新的数据到UserPassword.txt,其中的errorcount会随着失败尝试次数的增长而增长,三次就是2,即0,1,2 write_data = open('UserPassword.txt', 'w+') # 将字典里面的值取到_user_value中,进行循环遍历 for user_value in user_dict.values(): # 往脚本开头定义好的空列表里面逐行写入数据 user_list = [user_value['name'], user_value['password'], str(user_value['locked']), str(user_value['errorcount'])] # 将写入到user_list的数据再次进行格式化后赋给users_list users_list = ','.join(user_list) # 将users_list中的数据写入到UserPassword.txt中,并在每一行数据的结尾进行换行 write_data.write(users_list + '\n') # 关闭UserPassword.txt文档 write_data.close() else: # 若是密码不正确的次数已经超过3次,就输出帐户被锁定 print("You try three times,Account locked") # 输出帐户锁定的同时,将字典中locked键的值设置为1,这个地方改为1,前面判断Locked状态的IF才生效 user_dict[logon_name]['locked'] = 1 # 帐户设置为锁定以后,将用户对应的错误密码次数清零,我理解的是锁定属性为1了,错误次数能够清零 user_dict[logon_name]['errorcount'] = 0 write_data = open('UserPassword.txt', 'w+') for user_value in user_dict.values(): user_list = [user_value['name'], user_value['password'], str(user_value['locked']), str(user_value['errorcount'])] users_list = ','.join(user_list) write_data.write(users_list + '\n') write_data.close() break else: # 若是用户名不存在,则输出信息 print("Pls ensure input currect account or password,you can try three times!") # 程序开头设置了初始化不存在用户名的值为0,这里进行自增 login_error_count += 1 # 若是不存在的用户尝试次数超过3次,则中断程序 if login_error_count > 2: break