hashlib、logging模組

F.or,T發表於2019-01-27

hashlib模組

hashlib提供了常見的摘要演算法,如md5和sha1等等。

那麼什麼是摘要演算法呢?摘要演算法又稱為雜湊演算法、雜湊演算法。它通過一個函式,把任意長度的資料轉換為一個長度固定的資料串(通常用16進位制的字串表示)。

注意:摘要演算法不是一個解密演算法。(摘要演算法,檢測一個字串是否發生了變化)

應用:1.做檔案校驗

   2.登入密碼

      密碼不能解密,但可以撞庫,用‘加鹽’的方法就可以解決撞庫的問題。所有以後設定密碼的時候要設定的複雜一點。

import hashlib
# md5_obj = hashlib.md5()  未加鹽
md5_obj = hashlib.md5(`luffy`.encode(`utf-8`)) #加鹽後(就讓你的密碼更牢固了)
md5_obj.update(`123456`.encode(`utf-8`))
print(md5_obj.hexdigest())
md5_obj.update(`hello`.encode(`utf-8`))
print(md5_obj.hexdigest())
# -----------
user = `zorro`
password = `123456`
md5_obj= hashlib.md5(user.encode(`utf-8`))  #加鹽(哪怕別人的密碼和你的密碼一樣,
# 那你加鹽以後就只有你的使用者名稱對應的是你的密碼了)
md5_obj.update(password.encode(`utf-8`))
print(md5_obj.hexdigest())

 

import hashlib
md5_obj = hashlib.md5()
import os
filesize = os.path.getsize(`filename`)  #檔案大小
f = open(`filename`,`rb`)
while filesize>0:
    if filesize > 1024:
        content = f.read(1024)
        filesize -= 1024
    else:
        content = f.read(filesize)
        filesize -= filesize
    md5_obj.update(content)
# for line in f:
#     md5_obj.update(line.encode(`utf-8`))
md5_obj.hexdigest()

# 檔案校驗(檢測檔案改變了沒)

 

logging模組

1. 日誌級別

日誌一共分成5個等級,從低到高分別是:

  1. DEBUG
  2. INFO
  3. WARNING
  4. ERROR
  5. CRITICAL

說明:

  • DEBUG:詳細的資訊,通常只出現在診斷問題上
  • INFO:確認一切按預期執行
  • WARNING:一個跡象表明,一些意想不到的事情發生了,或表明一些問題在不久的將來(例如。磁碟空間低”)。這個軟體還能按預期工作。
  • ERROR:更嚴重的問題,軟體沒能執行一些功能
  • CRITICAL:一個嚴重的錯誤,這表明程式本身可能無法繼續執行

這5個等級,也分別對應5種打日誌的方法: debug 、info 、warning 、error 、critical。預設的是WARNING,當在WARNING或之上時才被跟蹤。

2. 日誌輸出

有兩種方式記錄跟蹤,一種輸出控制檯,另一種是記錄到檔案中,如日誌檔案。

2.1、將日誌輸出到控制檯

import logging

logging.basicConfig(level=logging.WARNING,
                    format=`%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s`)

# 開始使用log
logging.info("這是 logging info message")
logging.debug("這是 logging debug message")
logging.warning("這是 logging warning message")
logging.error("這是 logging error message")
logging.critical("這是 logging critical message")

# 輸出結果
# 2019-01-27 10:00:27,896 - 將日誌輸出控制檯.py[line:9] - WARNING: 這是 logging warning message
# # # 2019-01-27 10:00:27,896 - 將日誌輸出控制檯.py[line:10] - ERROR: 這是 logging error message
# # # 2019-01-27 10:00:27,896 - 將日誌輸出控制檯.py[line:11] - CRITICAL: 這是 logging critical message

說明

  通過logging.basicConfig函式對日誌的輸出格式及方式做相關配置,上面程式碼設定日誌的輸出等級是WARNING級別,意思是WARNING級別以上的日誌才會輸出。另外還制定了日誌輸出的格式。

  注意,只要用過一次log功能再次設定格式時將失效,實際開發中格式肯定不會經常變化,所以剛開始時需要設定好格式

 

2.2、將日誌輸出到檔案

我們還可以將日誌輸出到檔案,只需要在logging.basicConfig函式中設定好輸出檔案的檔名和寫檔案的模式

import logging

logging.basicConfig(level=logging.WARNING,
                    filename=`log.txt`,
                    filemode=`w`,
                    format=`%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s`)

# 開始使用log
logging.info("這是 logging info message")
logging.debug("這是 logging debug message")
logging.warning("這是 logging warning message")
logging.error("這是 logging error message")
logging.critical("這是 logging critical message")

 

2.3、既要把日誌輸出到控制檯, 還要寫入日誌檔案

import logging

# 第一步, 建立一個logger
logger = logging.getLogger()
logger.setLevel(logging.INFO)  # log等級總開關

# 第二步,建立一個handler,用於寫入日誌檔案
logfile = `log.txt`
fh = logging.FileHandler(logfile, mode=`a`, encoding=`utf-8`)  # open的開啟模式
fh.setLevel(logging.DEBUG)  # 輸出到file的log等級的開關

# 第三步, 再建立一個handler,用於輸出控制檯
ch = logging.StreamHandler()
ch.setLevel(logging.WARNING)  # 輸出到控制檯的log等級的開關

# 第四步, 定義handler的輸出格式
formatter = logging.Formatter(`%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s`)
fh.setFormatter(formatter)
ch.setFormatter(formatter)

# 第五步, 將logger新增到handler裡面
logger.addHandler(fh)
logger.addHandler(ch)

# 日誌
logging.info("這是 logging info message")
logging.debug("這是 logging debug message")
logging.warning("這是 logging warning message")
logging.error("這是 logging error message")
logging.critical("這是 logging critical message")

 

3、日誌格式說明

logging.basicConfig函式中,可以指定日誌的輸出格式format,這個引數可以輸出很多有用的資訊,如下:

%(levelno)s: 列印日誌級別的數值
%(levelname)s: 列印日誌級別名稱
%(pathname)s: 列印當前執行程式的路徑,其實就是sys.argv[0]
%(filename)s: 列印當前執行程式名
%(funcName)s: 列印日誌的當前函式
%(lineno)d: 列印日誌的當前行號
%(asctime)s: 列印日誌的時間
%(thread)d: 列印執行緒ID
%(threadName)s: 列印執行緒名稱
%(process)d: 列印程式ID
%(message)s: 列印日誌資訊
在工作中給的常用格式如下:

format=`%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s`
這個格式可以輸出日誌的列印時間,是哪個模組輸出的,輸出的日誌級別是什麼,以及輸入的日誌內容。

 

原文:http://www.cnblogs.com/haiyan123/p/7382604.html

 

相關文章