2016-12-15 74 views
0

我的Python 3.5.2中的登錄腳本有問題。簡單的登錄腳本文件中的多個用戶

與我的代碼的問題是,只有文件users.txt第一個用戶可以通過登錄。第二和第三個用戶收到「錯誤的用戶名/密碼」消息。我在這裏錯過了什麼?

數據在users.txt被格式化這樣的:

名稱|姓|角色| ID |用戶名|密碼

約翰|約翰遜|導演| 1個|聯繫我們|後臺管理

Mike | Madson |首席財務官| 2 |邁克|邁克

問題只有約翰通行證登錄,我也需要邁克。

def check(): 

    username = str(input("Username: ")) 
    password = str(input("Password: ")) 

    f = open("users.txt", "r") 
    file_content = f.read() 
    users = file_content.split("\n") 
    for user in users: 
     user_array = user.split("|") 
     uname = user_array[4] 
     pword = user_array[5] 
     if uname == username and pword == password: 
      print("Hello " + user_array[1] + ".") 
      print("You are logged in as: " + user_array[2] + ".") 
      main_menu() 
     else: 
      print("Wrong username/password.") 
      print("Try again!\n\n") 
      check() 
check() 

感謝您的幫助!

回答

0

邏輯錯了。你需要類似的東西:

def check(): 
    # You need to read it only once, not every loop 
    users = open("users.txt").read().split("\n") 
    for i in range(len(users)): users[i] = users[i].split("|") 

    # Now what you want is to loop infinitely 
    # until you get correct username/password 
    # instead of recursive calling this 
    # function over and over again 
    while True: 
     username = str(input("Username: ")) 
     password = str(input("Password: ")) 

     for user in users: 
      uname = user[4] 
      pword = user[5] 

      if uname == username and pword == password: 
       print("Hello " + user[1] + ".") 
       print("You are logged in as: " + user[2] + ".") 
       main_menu() 

     # If none of the records matched the input 
     print("Wrong username/password.") 
     print("Try again!\n\n") 

check() 
+0

我試過了,但是我得到了NameError :name'xrange'未定義 – FrankieD

+0

xrange在python 3中被重命名爲範圍,並且它們消除了xrange函數。它只是返回一個發電機,而不是Python中的列表3 – wpercy

+0

@wpercy耶現在它的工作,謝謝你們:) – FrankieD

0

這是因爲該行

if uname == username and pword == password: 

的因爲你要求他們在函數的開頭的用戶名和密碼的用戶,我認爲他們請輸入「admin」和「admin」,這個檢查是唯一要通過這個組合。您應該在for循環中包含input請求,或者將其重構爲更好。

+0

嗯,是的,我的邏輯很糟糕... – FrankieD

0

當你閱讀的文本文件,約翰將是第一個,所以你的使用,如果statment進行比較,如果用戶名和密碼匹配,你僅與第一comapring時文本文件的一行。所以當你進入麥克風時,它會與文本文件上的約翰相符合,從我所瞭解的情況來看,這就是你出錯的地方