路飛學城-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() 

導師批註:python

一、寫代碼必定要多注意代碼的書寫規範,多參閱pep8規範文檔;編程

二、對用戶輸入的數據,應對首尾空格進行處理;函數

三、文件操做時,應指定字符編碼格式(不一樣的操做系統,會出現字符編碼錯誤);學習

  在作這份做業時,也是剛學的python編程,看老師提供的視頻教程,python編程從入門到實踐這本書,在遇到老師所講的或者本身在書上看到的不太明白的知識點時,就本身到網上諸如博客園之類的去尋找幫助,看看別人對於一個方法是怎麼去使用,或者爲了實現一個功能是用哪一個方法比較好,諸如該如何去實現文件的讀寫操做,這是在視頻教程裏還沒講到的內容,但做業裏須要用到,那這就要求我必須提早去學習文件的讀寫操做是如何實現的。編碼

  在作這份做業時個人重點也全都是放在了該如何去作出做業所要求實現的功能,對於其它如導師所提到的pep8編碼規範則是從未據說也從未看到過,在看到導師批註後去認真的把這個pep8編碼規範看了一遍,原來並非說咱們寫完代碼後不報錯、能正常運行、能夠實現所須要的功能就OK了,原來代碼編寫的背後還有這麼個規範去要求咱們,諸如:spa

  空格的使用
    整體原則,避免沒必要要的空格。
    1 各類右括號前不要加空格。
    2 逗號、冒號、分號前不要加空格。
    3 函數的左括號前不要加空格。如Func(1)。
    4 序列的左括號前不要加空格。如list[2]。
    5 操做符左右各加一個空格,不要爲了對齊增長空格。
    6 函數默認參數使用的賦值符左右省略空格。
    7 不要將多句語句寫在同一行,儘管使用‘;’容許。
    8 if/for/while語句中,即便執行語句只有一句,也必須另起一行。操作系統

  註釋
    整體原則,錯誤的註釋不如沒有註釋。因此當一段代碼發生變化時,第一件事就是要修改註釋!
    註釋必須使用英文,最好是完整的句子,首字母大寫,句後要有結束符,結束符後跟兩個空格,開始下一句。若是是短語,能夠省略結束符。
    1 塊註釋,在一段代碼前增長的註釋。在‘#’後加一空格。code

關於文件的讀寫操做:視頻

  使用python來讀寫文件是很是簡單的操做,咱們使用open()函數來打開一個文件,獲取到文件句柄,而後經過文件句柄就能夠對文件進行各類各樣的操做了,根據打開方式的不一樣,可以執行的操做也會有相應的差別。blog

  打開文件的方式有:r , w , a , r+ , w+ , a+ , rb , wb , ab , r+b , w+b , a+b等,默認使用的是r(只讀)模式。

一、只讀操做(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更多的是使用在讀取非文本文件的時候,諸如讀取MP三、圖像‘視頻等信息的時候就須要用到rb,由於這種數據是沒有辦法直接顯示出來的,在實現文件的上傳下載時也會用到rb。

    f.readline() 是一行一行的讀取數據,可是在讀取出來的數據結尾處會有一個\n,這時就須要咱們調用strip()方法將其去掉。

  循環讀取數據這種方式是很好的,每次只讀取出一行內容,從而就避免了產生內存溢出的問題。

  注意:讀取完的文件句柄必定要關掉,使用pd.close()。

 

二、寫模式(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()
相關文章
相關標籤/搜索