路飛學城-python開發集訓-第一章之用用戶登錄作業
#coding = utf-8
import datetime
today=datetime.date.today() #讀取當前日期
password = {} #創建字典
passwd = open(‘user_file.txt‘,‘r‘) #以只讀的模式打開,確保文件存在,否則報錯
for f in passwd.readlines(): #讀取文件的全部內容
u = f.split(‘\n‘)[0] # 以回車為分割取出用戶名
p = f.split(‘\n‘)[0] #以回車為分割取出密碼
m = p.split(‘\n‘)[0] #以回車為分割符,取出密碼的完整內容
password[p] = m
#print (password)
passwd.close()
lock = {}
user = {}
lock_info = open(‘lock_file.txt‘,‘r‘) #以只讀的模式打開
user_info = open(‘user_file.txt‘,‘r‘) # 以只讀的模式打開
for i in lock_info.readlines():
k1 = i.split(‘\n‘)[0]
lock[k1]=k1
for u in user_info.readlines():
n=u.split(‘\n‘)[0]
user[n]=n
#print (lock)
#print (user)
count = 0
lock_info.close()
user_info.close()
username = input("請輸入您的用戶名:")
if username in lock.keys():
print ("該用戶已被鎖定,無法正常登錄! ")
elif username in user.keys():
pwd = input("請輸入您的密碼:")
if pwd == password[username]:
welcome="""
-----------Welcome info----------
登錄成功!
歡迎您:%s,今天是:%s.
---------------End--------------
"""%(username,today)
print(welcome)
else:
while count < 2:
pwd = input("密碼錯誤,請重新輸入:")
if pwd == password[username]:
welcome="""
-----------Welcome info----------
登錄成功!
歡迎您:%s,今天是:%s.
---------------End--------------
"""%(username,today)
print(welcome)
break
count+=1
else:
lock_user = open("lock_file.txt",‘a‘) #將被鎖定的用戶名追加寫入lock_file.txt文件中
lock_user.write(username+‘\n‘)
lock_user.close()
print ("您的密碼輸入錯誤超過三次,用戶被鎖定!")
else:
print("無效的用戶名,系統退出!")
exit()
導師批註:
1、寫代碼一定要多註意代碼的書寫規範,多參閱pep8規範文檔;
2、對用戶輸入的數據,應對首尾空格進行處理;
3、文件操作時,應指定字符編碼格式(不同的操作系統,會出現字符編碼錯誤);
在做這份作業時,也是剛學的python編程,看老師提供的視頻教程,python編程從入門到實踐這本書,在遇到老師所講的或者自己在書上看到的不太明白的知識點時,就自己到網上諸如博客園之類的去尋找幫助,看看別人對於一個方法是怎麽去使用,或者為了實現一個功能是用哪個方法比較好,諸如該如何去實現文件的讀寫操作,這是在視頻教程裏還沒講到的內容,但作業裏需要用到,那這就要求我必須提前去學習文件的讀寫操作是如何實現的。
在做這份作業時我的重點也全都是放在了該如何去做出作業所要求實現的功能,對於其它如導師所提到的pep8編碼規範則是從未聽說也從未看到過,在看到導師批註後去認真的把這個pep8編碼規範看了一遍,原來並不是說我們寫完代碼後不報錯、能正常運行、可以實現所需要的功能就OK了,原來代碼編寫的背後還有這麽個規範去要求我們,諸如:
空格的使用
總體原則,避免不必要的空格。
1 各種右括號前不要加空格。
2 逗號、冒號、分號前不要加空格。
3 函數的左括號前不要加空格。如Func(1)。
4 序列的左括號前不要加空格。如list[2]。
5 操作符左右各加一個空格,不要為了對齊增加空格。
6 函數默認參數使用的賦值符左右省略空格。
7 不要將多句語句寫在同一行,盡管使用‘;’允許。
8 if/for/while語句中,即使執行語句只有一句,也必須另起一行。
註釋
總體原則,錯誤的註釋不如沒有註釋。所以當一段代碼發生變化時,第一件事就是要修改註釋!
註釋必須使用英文,最好是完整的句子,首字母大寫,句後要有結束符,結束符後跟兩個空格,開始下一句。如果是短語,可以省略結束符。
1 塊註釋,在一段代碼前增加的註釋。在‘#’後加一空格。
關於文件的讀寫操作:
使用python來讀寫文件是非常簡單的操作,我們使用open()函數來打開一個文件,獲取到文件句柄,然後通過文件句柄就可以對文件進行各種各樣的操作了,根據打開方式的不同,能夠執行的操作也會有相應的差異。
打開文件的方式有:r , w , a , r+ , w+ , a+ , rb , wb , ab , r+b , w+b , a+b等,默認使用的是r(只讀)模式。
1、只讀操作(r、rb)
pd = open(‘user_file.txt‘, mode=‘r‘, encoding=‘utf-8‘) # 以只讀的模式打開,確保文件存在,否則報錯
for f in pd.readlines(): # 讀取文件的全部內容
u = f.split(‘\n‘)[0] # 以回車為分割取出用戶名
p = f.split(‘\n‘)[0] # 以回車為分割取出密碼
m = p.split(‘\n‘)[0] # 以回車為分割符,取出密碼的完整內容
password[p] = m
pd.close()
需要註意的是:文件操作時,應指定字符編碼格式(不同的操作系統,會出現字符編碼錯誤),encoding表示編碼集,根據文件的實際保存編碼進行獲取數據,對於我們而言,更多的是utf-8。
rb讀取出來的數據是bytes類型,在rb模式下,不能選擇encoding字符集。rb更多的是使用在讀取非文本文件的時候,諸如讀取MP3、圖像‘視頻等信息的時候就需要用到rb,因為這種數據是沒有辦法直接顯示出來的,在實現文件的上傳下載時也會用到rb。
f.readline() 是一行一行的讀取數據,但是在讀取出來的數據結尾處會有一個\n,這時就需要我們調用strip()方法將其去掉。
循環讀取數據這種方式是很好的,每次只讀取出一行內容,從而就避免了產生內存溢出的問題。
註意:讀取完的文件句柄一定要關掉,使用pd.close()。
2、寫模式(w、wb、a)
寫的時候要註意,如果沒有文件,則會自動創建文件,如果文件已經存在,則會將原文件中的內容全部刪除後再將新內容寫入到文件中:
lock_user = open("lock_file.txt", mode=‘a‘, encoding=‘utf-8‘) # 將被鎖定的用戶名追加寫入lock_file.txt文件中
lock_user.write(username+‘\n‘)
lock_user.close()
print("您的密碼輸入錯誤超過三次,用戶被鎖定!")
wb模式下,可以不指定打開文件的編碼集,但是在寫文件的時候必須將字符串轉化成utf-8的bytes數據。
a 追加模式下, 寫入的內容會加在結尾。
修改完後代碼如下:
1 #coding = utf-8 2 import datetime 3 import os 4 today = datetime.date.today() # 讀取當前日期 5 password = {} # 創建字典 6 pd = open(‘user_file.txt‘, mode=‘r‘, encoding=‘utf-8‘) # 以只讀的模式打開,確保文件存在,否則報錯 7 for f in pd.readlines(): # 讀取文件的全部內容 8 u = f.split(‘\n‘)[0] # 以回車為分割取出用戶名 9 p = f.split(‘\n‘)[0] # 以回車為分割取出密碼 10 m = p.split(‘\n‘)[0] # 以回車為分割符,取出密碼的完整內容 11 password[p] = m 12 pd.close() 13 lock = {} 14 user = {} 15 lock_info = open(‘lock_file.txt‘, mode=‘r‘, encoding=‘utf-8‘) # 以只讀的模式打開 16 user_info = open(‘user_file.txt‘, mode=‘r‘, encoding=‘utf-8‘) # 以只讀的模式打開 17 for i in lock_info.readlines(): 18 k1 = i.split(‘\n‘)[0] 19 lock[k1] = k1 20 for u in user_info.readlines(): 21 n = u.split(‘\n‘)[0] 22 user[n] = n 23 count = 0 24 lock_info.close() 25 user_info.close() 26 username = input("請輸入您的用戶名:").strip() 27 if username in lock.keys(): 28 print("該用戶已被鎖定,無法正常登錄!") 29 elif username in user.keys(): 30 pwd = input("請輸入您的密碼:").strip() 31 if pwd == password[username]: 32 welcome = """ 33 -----------Welcome info---------- 34 登錄成功! 35 歡迎您:%s,今天是:%s. 36 ---------------End-------------- 37 """ % (username, today) 38 print(welcome) 39 else: 40 while count < 2: 41 pwd = input("密碼錯誤,請重新輸入:").strip() 42 if pwd == password[username]: 43 welcome = """ 44 -----------Welcome info---------- 45 登錄成功! 46 歡迎您:%s,今天是:%s. 47 ---------------End-------------- 48 """ % (username, today) 49 print(welcome) 50 break 51 count += 1 52 else: 53 lock_user = open("lock_file.txt", mode=‘a‘, encoding=‘utf-8‘) # 將被鎖定的用戶名追加寫入lock_file.txt文件中 54 lock_user.write(username+‘\n‘) 55 lock_user.close() 56 print("您的密碼輸入錯誤超過三次,用戶被鎖定!") 57 else: 58 print("無效的用戶名,系統退出!") 59 exit()
路飛學城-python開發集訓-第一章之用用戶登錄作業