這是自己做的練習,可能有錯誤,歡迎討論和各種最佳化重構方案。
根據讀者反饋,或者code review,我對本篇文章答案或者相關內容的更新補充,一般會被添加在本篇部落格的評論中。
我盡量保證每題的答案代碼是完整的,不僅僅是函數或者類,開啟Python 2.7的IDLE,將代碼完整拷貝進去,就能調試運行。
歡迎訪問Balian在部落格園的家http://www.cnblogs.com/balian
13-4.
使用者註冊。建立一個使用者資料庫(包括登入名稱、密碼和上次登入時間戳記)類(參考練習7-5和練習9-12),來管理一個系統。該系統要求使用者在登入後才能訪問某些資源。這個資料庫類對使用者進行管理,並在執行個體化操作時載入之前儲存的使用者資訊,提供訪問函數來添加或更新資料庫的資訊。在資料修改後,資料庫會在記憶體回收時將新資訊儲存到磁碟(參見__del__())。
【注】
我使用D盤EX13_4檔案夾裡的accounts.txt檔案記錄使用者名稱和密碼。只有一個使用者Balian,密碼是apple。用同位置的檔案userlog.txt記錄上次登入時間戳記。如果使用者Balian登陸正確,就返回上次登陸時間,和登陸成功資訊。如果使用者名稱或者密碼錯誤,都將提示登陸失敗,失敗3次退出程式。對使用者進行管理指如果登陸成功,可更新密碼。這樣做的目的是想使代碼盡量簡單,畢竟這隻是一個練習題。
accounts.txt檔案內容(僅一行)
balian 123456
userlog.txt為一個空文字檔
運行程式前,請提前準備以上的檔案夾和檔案。
【答案】
代碼如下:
#-*- encoding: utf-8 -*-class DBMnagement(object): '資料庫管理類' def __init__(self, nm, pwd): self.name = nm self.password = pwd def updatePWD(self, newpwd): self.password = newpwd def __del__(self): pass #import osimport timedef CreateLog(username): '登陸成功寫時間戳記到log檔案' timeStamp = time.ctime(time.time()) log = 'User' + ' - ' + username + ', last time login Succeed at ' + timeStamp + '\n' logFile = open('d:\\EX13_4\\userlog.txt', 'a') logFile.write(log) logFile.close() def ReadLog(): '登陸成功,從log檔案讀取上次時間戳記' logFile = open('d:\\EX13_4\\userlog.txt') logInfo = logFile.readlines() if len(logInfo) >= 1: print logInfo[-1] logFile.close() def ChangePWDinLog(username, newpwd): '修改使用者密碼' credentialFile = open('d:\\EX13_4\\accounts.txt', 'w') credentialtxt = username + ' ' + newpwd credentialFile.write(credentialtxt) credentialFile.close() print '密碼已修改 ... Password updated successfully. \n'# 從這裡開始是主程式print '歡迎使用最簡單的使用者管理系統'print '嘗試用系統中已經存在的使用者名稱和密碼登入,有三次機會'print '登陸成功後輸入 updatepwd 命令可以修改密碼,成功後退出系統'print '登陸成功後輸入 quit 命令退出系統\n' credentialFile = open('d:\\EX13_4\\accounts.txt') # 從文字檔中擷取使用者名稱和密碼credentialInfo = credentialFile.readlines()credentialFile.close()usernameinDB = credentialInfo[-1].split()[0] # 這裡credentialInfo[-1]是一個字串,包括使用者名稱和口令,空格隔開的passwordindm = credentialInfo[-1].split()[1]errorTimes = 3while errorTimes: print '請輸入使用者名稱和密碼:' input_username = raw_input('Username ... : ') input_password = raw_input('Password ... : ') if input_username == usernameinDB and input_password == passwordindm: print '登陸成功 ... Login Successful' CurrentUser = DBMnagement(input_username, input_password) ReadLog() CreateLog(input_username) input_command = raw_input('請輸入你的命令, quit or updatepwd ... \n') if input_command == 'quit': del CurrentUser print '\n已退出系統 ... Logout successfully.' break elif input_command == 'updatepwd': newpwd = raw_input('\n請輸入新密碼, new password ... : ') CurrentUser.updatePWD(newpwd) ChangePWDinLog(CurrentUser.name, CurrentUser.password) del CurrentUser print '\n已退出系統 ... Logout successfully.' break else: print '錯誤命令 ... Wrong Command' del CurrentUser print '\n已退出系統 ... Logout successfully.' break else: print '使用者名稱或口令錯誤 ... Wrong Username or Password.\n' errorTimes -= 1 if errorTimes == 0: print '已退出系統 ... Logout successfully.'
【執行結果】
歡迎使用最簡單的使用者管理系統嘗試用系統中已經存在的使用者名稱和密碼登入,有三次機會登陸成功後輸入 updatepwd 命令可以修改密碼,成功後退出系統登陸成功後輸入 quit 命令退出系統請輸入使用者名稱和密碼:Username ... : balianPassword ... : 123使用者名稱或口令錯誤 ... Wrong Username or Password.請輸入使用者名稱和密碼:Username ... : balianPassword ... : 123456使用者名稱或口令錯誤 ... Wrong Username or Password.請輸入使用者名稱和密碼:Username ... : balianPassword ... : apple登陸成功 ... Login SuccessfulUser - balian, last time login Succeed at Wed Sep 12 12:32:35 2012請輸入你的命令, quit or updatepwd ... updatepwd請輸入新密碼, new password ... : egg密碼已修改 ... Password updated successfully. 已退出系統 ... Logout successfully.
【參考】
http://blog.csdn.net/lgfei/article/details/92044
Python中寫文字檔的方法
http://magustest.com/blog/softwaretesting/how-to-write-a-file-by-using-python/