day33 Pyhton logging 模組和包
阿新 • • 發佈:2018-12-01
一內容回顧
try/except
try/except/else
try/finally
try/except
try/except/finally
try/except/else/finally
報錯的時候
1檢查程式邏輯是不是有問題
2.邏輯沒有問題,但是就是會報錯
找到具體錯誤的那一行程式碼
在這一行程式碼上加上try,再根據錯誤型別進行處理
主動拋異常
raise 異常型別
自定義異常
繼承BaseException
__str__方法的返回值就是這個異常丟擲之後的異常內容
斷言 assert語法,不滿足條件就報錯
hasblib模組
摘要模組:各種各樣的摘要演算法
md5/sha1
兩件事:
1.密碼的密文儲存: 各種演算法 動態加鹽
2.檔案的一致性校驗
md5_obj =hashlib.md5(bytes 鹽)# 建立一個新的md5值計算的物件
md5_obj.update(bytes) #每一次uodate,相當於在原來的字串後面加上新的字串
md5_obj.hexdigest() #只是獲取最終結果
二今日內容
logging #日誌模組
給使用者看 : 銀行流水\購物記錄
哪一個管理員什麼時候登陸 刪除了一個學生
給程式設計師看的 :
計算器 'asjkdghlghljgjl;;' 計算錯誤了
錄下每一個使用者讓你計算的表示式
記錄下每一個計算的步驟是怎麼錯的
# f = open() # f.write('年月日時分秒 所在的檔案 錯誤的級別 asjhkhkaghkldgh') # f.close() # 格式不好看 logging模組 這些格式你就不需要反覆寫 # 每一次都需要自己開啟檔案\關閉檔案 logging就不需要了 # 有一些資訊 能夠控制它在某一寫特定的時刻就打印出來
# logging模組不能自動幫助你生成日誌,仍然是你自己寫你想寫的內容# logging只是幫助你 簡化操作檔案的步驟\按照你的要求規劃日誌等級\幫助你規範格式
import logging # logging.basicConfig(level=logging.DEBUG) # logging.debug('debug message') # 最細節的 計算機計算的那些小過程 # logging.info('info message') # 普通訊息 記錄每個使用者的操作 # logging.warning('warning message')# 警告資訊 你覺得可能會影響到你程式的安全\正確率的內容 # logging.error('error message') # 錯誤資訊 直接影響你程式的健康了 # logging.critical('critical message')#批判的 把整個userinfo檔案刪掉了 # 預設顯示warning以上的日誌
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename = 'test.log', filemode = 'a'
# 1.作業系統的編碼可能會出現亂碼問題
# 2.不支援同時向檔案和螢幕輸出
import logging
#logger物件的方式: 靈活性 可擴充套件性
logger = logging.getLogger() #建立一個logger物件
logger.setLevel(logging.DEBUG)
#建立一個檔案操作符 來準備操作日誌向檔案中寫這件事
fh = logging.FileHandler('mylog.log',encoding='utf-8')
fh2 = logging.FileHandler('mylog2.log',encoding='utf-8')
#建立一個螢幕操作符,來準備操作日誌向螢幕中寫這件事
sh = logging.StreamHandler()
#建立一個輸出格式
formatter = logging.Formatter('%(asctime)s%(filename)s[line:%(lineno)d]%(levelname)s %(message)s')
formatter2 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#組合
#輸出格式和檔案操作符\螢幕操作符綁在一起
fh.setFormatter(formatter)
sh.setFormatter(formatter2)
sh.setLevel(logging.ERROR)
# logger物件分別和檔案操作符\螢幕操作符綁在一起
logger.addHandler(fh)
logger.addHandler(fh2)
logger.addHandler(sh)
#才開始能夠使用logger來記錄日誌
logger.debug('debug message') logger.info('info message') logger.warning('warning message') logger.error('error message') logger.critical('critical message')
三.模組
# mymodule就是模組 # import mymodule mymodule就是一個變量了
# 匯入一個模組相當於什麼??? # 執行了這個模組對應的檔案 # 並且在執行的過程中 所有的函式名\變數名\類名都會繫結在這個模組中
# 1.開闢了一塊屬於這個模組的空間 # 2.讓這個匯入的名字mymodule指向這個空間 # 3.執行模組中的程式碼,把所有的名字都儲存在這個空間中
# 模組會被重複匯入麼?不會
# import mymodule as m # print(m.name) # m.read1()
# as語句的用法 # 1.名字很長的時候 # 2.相同功能名字不同的幾個模組的相容問題
# from mymodule import name,read2 # from import 這個語法一旦執行,相當於什麼? # from import 仍然相當於執行整個檔案 # 在from import 的過程中發生了什麼事情? # 1.建立一個空間 # 2.執行模組的程式碼 並且把每一個變數都放在空間中 # 3.建立變數名 = import的名字,並且指向空間中對應的變數 # 注意 : # 在寫程式碼的過程中,不要取和匯入的變數名相同的名字,否則會導致匯入的名字不可用 #模組中的變數永遠是獨立的,在內部是獨立的使用的