隨老男孩學習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