2017-11-18 75 views
0

就我而言,我正在創建一個註冊表,並且需要通過使用CSV將登錄憑據存儲到外部文件中。如何在Python中使用CSV讀取所有行?

我有2個問題:

  1. 每次登錄(用戶名和密碼),除了第一個不 工作。我第一次登錄「14JeoJun」的用戶名和「海鷗」 作品,但下一個「13ParJim」的用戶名和「excuseme」 密碼不對,還有休息之後。我認爲這是因爲它沒有讀取所有的行。
  2. 它不會循環3次代碼,然後關閉。它會永遠循環它,如果你一直搞錯了,即使登錄憑證不是第一個但是是正確的。如果第一個登錄憑證是正確的,則停止循環並退出。我認爲這是因爲上面的第一個問題。

    with open("login_credential.txt","r") as login_credential: 
    for x in range (0,2): 
        inputted_username = input("Please enter your username - ") 
        inputted_password = input("Please enter your password - ") 
        login_credentialReader = csv.DictReader(login_credential) 
        for lines in login_credentialReader: 
          if lines["username"].lower() == inputted_username and lines["password"].lower() == inputted_password: 
           print("Welcome...") 
           sys.exit() 
          elif lines["username"].lower() != inputted_username or lines["password"].lower() != inputted_password: 
           x += 1 
           print("Login credentials are incorrect. Please try again.") 
           login() 
        if x >= 3: 
         print("Too many incorrect tries...") 
         sys.exit 
    

這是在我的外部文件(login_credential.txt):

用戶名,密碼,名,姓,一年
14JeoJun,海鷗,Jungkook,全度妍2014
13ParJim,excuseme,濟民,公園,2013
10KimNam,gotjams,Namjoon,金,2010

每當我先切換,只有第一個會起作用。

+0

讀取csv文件是這樣一個標準問題;你爲什麼不使用熊貓,這將更容易處理數據,因爲你可以以矢量化的方式處理所有這些循環? – Magellan88

+0

@ Magellan88它看起來像是學校作業 – Gnudiff

回答

0

讀取一次文件後,文件句柄關閉,您不能再讀取它。特別是,看看這裏:

with open("login_credential.txt","r") as login_credential: 
    for x in range (0,2): 
     inputted_username = input("Please enter your username - ") 
     inputted_password = input("Please enter your password - ") 
     login_credentialReader = csv.DictReader(login_credential) 
     for lines in login_credentialReader: 
      # ... 

     # ... 

for x in range(...)循環的第二次迭代, 文件句柄login_credential已充分閱讀, 就不會再重讀, 所以身體內部for循環的執行不會被執行。

此代碼還存在其他嚴重問題。 例如,在for x in range(...)循環中, 不應在循環體內修改x的值。 它可能無法按預期工作,因爲在下一次迭代中x將重置爲來自range(...)的下一個值。不要這樣做。

一個小問題,看在這些條件下:

if lines["username"].lower() == inputted_username and lines["password"].lower() == inputted_password: 
    # ... 
elif lines["username"].lower() != inputted_username or lines["password"].lower() != inputted_password: 
    # ... 

第二個條件是所述第一相反。 這是沒有意義的,你可以用一個簡單的else替換長的elif


按照一般的做法, 而不是重新讀取用戶, 它可能是更好的讀取文件的線只有一次的用戶名/密碼的每次重試密碼文件,以及重用它。 這將需要更多的內存,但保存在I/O上。 這可能是一個很好的折衷。

它可能是這樣的:

with open("login_credential.txt","r") as login_credential: 
    login_credentialReader = csv.DictReader(login_credential) 
    lines = [line for line in login_credentialReader] 

for x in range(2): 
    inputted_username = input("Please enter your username - ") 
    inputted_password = input("Please enter your password - ") 

    # ... 
+0

雖然這本身就是一個很好的答案,但我認爲它確實太多了,因爲提供完整的學校作業代碼解決方案並不符合學生的最佳利益(誰似乎在時刻與他自己的代碼的基本理解鬥爭),根據常見問題https://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions – Gnudiff

+1

@Gnudiff我同意你的意圖,但我不確定我放棄了太多。我認爲這是主觀的。但是我接受了您的建議並重寫了答案,做了更多的解釋並在銀盤上交出了更少的代碼。 – janos

0

你在做什麼目前正在檢查每一行,如果匹配,如果它沒有。

需要要做的只是檢查一行,如果匹配,如果不匹配 - 嘗試下一行。只有在文件中沒有行匹配的情況下,你需要說出錯誤的憑據 - 該行在循環之後。