1. 程式人生 > >菜鳥學Python第十七天

菜鳥學Python第十七天

菜鳥學python第十七天

1.logging 模組

  • logging模組即日誌記錄模組

  • 用途:用來記錄日誌

  • 為什麼要記錄日誌:

    為了日後複查,提取有用資訊

  • 如何記錄檔案

    直接開啟檔案,往裡寫東西

    直接寫入檔案的兩個問題:(logging模組解決這兩個問題)

    1. 你寫的資料格式 別人看不懂

    2. 解析資料模組

  • logging的使用

    • logging模組的兩種記錄日誌的方式

      1. 使用logging提供的模組級別函式

      2. 使用logging日誌系統四大元件

        <!--本質上logging模組級別函式日誌記錄就是對日誌系統四大元件內容的封裝-->

    • logging模組定義模組級別的常用函式級別:(從低到高,預設級別為warning,低於該級別的不列印)

      • debug : 最詳細的日誌資訊,典型運用場景是問題診斷 \10

      • info : 記錄普通訊息,用於確認一切都是按照我預期的那樣進行的 \20

      • warning : 警告資訊(記錄出錯之前的提示資訊及一些敏感操作) \30

      • error : 錯誤資訊(記錄程式遇到錯誤時的資訊) \40

      • critical : 嚴重錯誤(當程式遇到問題 無法繼續執行) \50

    • 分級的目的

      • 隨著日誌檔案的增多,成千上萬條,這時要提取有用的資訊很慢,所以這樣一來,在檢視日誌的時候,可以快速的定位篩選到想要的日誌

    import logging
    ​
    logging.debug('這是第一條日誌資訊')
    logging.info('這是第一條日誌資訊')
    logging.warning('這是第一條日誌資訊')
    logging.error('這是第一條日誌資訊')
    logging.critical('這是第一條日誌資訊')
    ​
    輸出結果:
    WARNING:root:這是第一條日誌資訊
    ERROR:root:這是第一條日誌資訊
    CRITICAL:root:這是第一條日誌資訊
            
    
    # 預設情況下,級別warning為輸出的位置時控制檯,預設的日誌格式為 級別:日誌級別:日誌資訊
     
    • 修改預設行為(logging.basicConfig()函式)

      該函式可以接收的關鍵字引數如下:

         
      引數名稱 描述
      filename 指定輸出檔案的檔名,指定該資訊後就不會被列印到控制檯了
      filemode 指定輸出檔案的開啟模式,預設為‘a',filename 指定時才有效
      level 指定日誌器的日誌級別
      format 指定日誌格式字串,即指定日誌輸出時所包含的欄位資訊及他們的順序
      stream 指定日誌輸出的stream
    • logging模組中定義好的可以用於format格式字串

 

欄位/屬性名稱 使用格式 描述
asctime %(asctime)s 日誌事件發生的時間--人類可讀時間,如:2003-07-08 16:49:45,896
created %(created)f 日誌事件發生的時間--時間戳,就是當時呼叫time.time()函式返回的值
relativeCreated %(relativeCreated)d 日誌事件發生的時間相對於logging模組載入時間的相對毫秒數(目前還不知道幹嘛用的)
msecs %(msecs)d 日誌事件發生事件的毫秒部分
levelname %(levelname)s 該日誌記錄的文字形式的日誌級別('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
levelno %(levelno)s 該日誌記錄的數字形式的日誌級別(10, 20, 30, 40, 50)
name %(name)s 所使用的日誌器名稱,預設是'root',因為預設使用的是 rootLogger
message %(message)s 日誌記錄的文字內容,通過 msg % args計算得到的
pathname %(pathname)s 呼叫日誌記錄函式的原始碼檔案的全路徑
filename %(filename)s pathname的檔名部分,包含檔案字尾
module %(module)s filename的名稱部分,不包含字尾
lineno %(lineno)d 呼叫日誌記錄函式的原始碼所在的行號
funcName %(funcName)s 呼叫日誌記錄函式的函式名
process %(process)d 程序ID
processName %(processName)s 程序名稱,Python 3.1新增
thread %(thread)d 執行緒ID
threadName %(thread)s 執行緒名稱
import logging
  
logging.basicConfig(filename='mylog.txt',  # 指定的日誌檔名
                      filemode='a',  # 指定的是穩健的開啟模式 通常為a
                      level=logging.DEBUG,  # 指定級別
                      format='%(filename)s %(levelname)s %(asctime)s \
                      %(message)s %(pathname)s')  # 指定顯示格式
  
logging.debug('這是一條日誌資訊')
logging.info('這是一條日誌資訊')
logging.warning('這是一條日誌資訊')
logging.error('這是一條日誌資訊')
logging.critical('這是一條日誌資訊')
  
# 輸出結果(mylog.txt)
#loging_test.py DEBUG 2018-12-07 19:44:25,417 這是一條日誌資訊 C:/Users/liusijun/PycharmProjects/loging_test.py
#loging_test.py INFO 2018-12-07 19:44:25,458 這是一條日誌資訊 C:/Users/liusijun/PycharmProjects/loging_test.py
#loging_test.py WARNING 2018-12-07 19:44:25,459 這是一條日誌資訊 C:/Users/liusijun/PycharmProjects/loging_test.py
#loging_test.py ERROR 2018-12-07 19:44:25,459 這是一條日誌資訊 C:/Users/liusijun/PycharmProjects/loging_test.py
#loging_test.py CRITICAL 2018-12-07 19:44:25,459 這是一條日誌資訊 C:/Users/liusijun/PycharmProjects/loging_test.py
  
  • 日誌的四大核心元件

    <!--logging模組提供的模組級別的那些函式實際上也是通過這幾個元件的相關類來記錄日誌的,只是在建立這些類時設定了一些預設值-->

    1. Loggers 日誌的生成器 負責產生一條完整的日誌

    2. Filter過濾器 負責對日誌進行過濾

    3. Handler處理器 負責將日誌輸出到指定位置

    4. Formatter格式化 負責處理日誌顯示的格式

  • 一條日誌的生命週期

    1. 由Loger產生日誌

    2. 交給filter過濾器進行過濾

    3. 交給Handler按照Formater的格式進行輸出

import logging
​
# logger產生日誌
a = logging.getLogger()
# 設定日誌級別
a.setLevel(10)
# filter  pass
# handler 控制日誌輸入到檔案或終端
fh1 = logging.FileHandler(filename='a.log', encoding='utf-8')  # 輸出到檔案
fh2 = logging.FileHandler(filename='b.log', encoding='utf-8')  # 輸出到檔案 
fh3 = logging.StreamHandler()  # 輸出到終端
fh1.setLevel(10)
fh2.setLevel(10)
fh3.setLevel(10)
​
# Formatter  控制日誌輸出格式
formatter1 = logging.Formatter(fmt='%(asctime)s %(module)s %(levelname)s %(message)s')
formatter2 = logging.Formatter(fmt="%(asctime)s %(module)s %(message)s",)
​
# logger繫結handler
a.addHandler(fh1)
a.addHandler(fh2)
a.addHandler(fh3)
​
# handle 繫結 Formatter
fh1.setFormatter(formatter1)
fh2.setFormatter(formatter2)
fh3.setFormatter(formatter2)
​
​
# 寫日誌
a.info('你好啊 !')
a.warning('你好啊 !')
a.debug('你好啊 !')
a.error('你好啊 !')
a.critical('你好啊 !')
  • 通過字典匯入配置

 

 

 


 

2.shelve模組

shelve模也是一個序列化的模組

僅有一個函式,open用於開啟一個檔案

開啟以後,操作方式與字典完全一致,你可以把它當做字典,而且自帶buff的字典,可以給字典完成序列化。

同樣支援python所有的基礎資料型別

該模組不支援跨平臺,序列化得到的資料,只能被該模組使用。

import shelve
​
# 序列化
​
a = {'name': 'jason', 'age': '23', 'weight': '75'}
b = {'name': 'james', 'age': '34', 'weight': '100'}
​
d = shelve.open('ds.shv')
d['jason'] = a
d['james'] = b
d.close()
​
執行結果:產生一個檔案(不同系統有差異)
​
# 反序列化
d = shelve.open('ds.shv')
print(d['jason'])
print(d['james'])
d.close()
​
執行結果:
{'name': 'jason', 'age': '23', 'weight': '75'}
{'name': 'james', 'age': '34', 'weight': '100'}
​
​
# 如果想改檔案裡面的內容,則需要更改shelve預設形參writeback
​
d = shelve.open('ds.shv', writeback=True)
d['jason']['age'] = 18
print(d['jason'])
​
執行結果:
{'name': 'jason', 'age': 18, 'weight': '75'}

 


 

3.sys 模組

  • sys模組:全稱system,指的是直譯器(os指的是作業系統)

  • 常用操作,用於接收系統作業系統呼叫直譯器傳入的引數

# 1 sys.argv           命令列引數List,第一個元素是程式本身路徑
print(sys.argv)
# 2 sys.exit(n)        退出程式,正常退出時exit(0)
print(sys.exit(1))
# 3 sys.version        獲取Python解釋程式的版本資訊
print(sys.version)
# 4 sys.maxint         最大的Int值
print(sys.maxsize)
# 5 sys.path           返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值
print(sys.path)
# 6 sys.platform       返回作業系統平臺名稱
print(sys.platform)