python開發基礎做業01:模擬登錄系統

隨老男孩學習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不存在不會報錯

流程圖

代碼示例1

#!/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()

代碼示例2

#!/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
相關文章
相關標籤/搜索