標籤:eve bitbucket 而且 十六進位 val 路徑名 format 使用 div
一. hashlib模組
Python的hashlib提供了常見的摘要演算法,如MD5,SHA1等等。
摘要演算法又稱雜湊演算法、散列演算法。它通過一個函數,把任意長度的資料轉換為一個長度固定的資料串(通常用16進位的字串表示)。
摘要演算法就是通過摘要函數f()對任意長度的資料data計算出固定長度的摘要digest,目的是為了發現未經處理資料是否被人篡改過。摘要演算法之所以能指出資料是否被篡改過,就是因為摘要函數是一個單向函數,計算f(data)很容易,但通過digest反推data卻非常困難。而且,對未經處理資料做一個bit的修改,都會導致計算出的摘要完全不同。
對於同一個字串,不管這個字串有多長,只要是相同的,無論在任何環境下,多少次執行,在任何語言中使用相同的演算法\相同的手段得到的結果永遠是相同的, 只要不是相同的字串,得到的結果一定不同.
1. MD5演算法
md5是一個演算法,32位的字串,每個字元都是一個十六進位, md5演算法特點: 效率快 演算法相對簡單
import hashlibs = ‘hello,world!‘md5_obj = hashlib.md5()md5_obj.update(s.encode(‘utf-8‘))res = md5_obj.hexdigest()print(res, type(res), len(res))# c0e84e870874dd37ed0d164c7986f03a <class ‘str‘> 32
雖然md5的值不會被反推, 但是有很多人通過撞庫的方法來擷取原字串.
撞庫: 使用者密碼通過計算出的md5的值唄存再資料庫, 但是有一批人通過實驗許多密碼,計算出這些密碼的md5值, 再去擷取別人的資料庫(密碼)拿來對比md5值,若是相同則可以得出密碼是多少.這樣密碼就不安全了.所以可以通過加鹽的方法來解決這種問題.
username = ‘jack‘password = ‘123jack‘md5_obj = hashlib.md5(username.encode(‘utf-8‘)) # 把使用者名稱當作鹽加進去md5_obj.update(password.encode(‘utf-8‘))res = md5_obj.hexdigest()print(res) # b94b1a2cd520ddc887df5c946e246eac
md5除了可以保護使用者密碼外, 還可以校檢檔案的一致性
with open(‘123‘, ‘rb‘)as f1: # rb模式 md5_obj1 = hashlib.md5() md5_obj1.update(f1.read()) res1 = md5_obj1.hexdigest()with open(‘321‘, ‘rb‘) as f2: # 我把檔案321內容設定的與檔案123一樣 md5_obj2 = hashlib.md5() md5_obj2.update(f2.read()) res2 = md5_obj2.hexdigest()print(res1) # 537c68a40a4736c27358ae78616c9fa7print(res2) # 537c68a40a4736c27358ae78616c9fa7
二. configparse模組
該模組適用於設定檔的格式與windows ini檔案類似,可以包含一個或多個節(section),每個節可以有多個參數(鍵=值)。
import configparserconfig = configparser.ConfigParser()# print(config.sections()) # []config.read(‘example.ini‘)# print(config.sections()) # [‘bitbucket.org‘, ‘topsecret.server.com‘]# print(‘bytebong.com‘ in config) # False# print(‘bitbucket.org‘ in config) # True# print(config[‘bitbucket.org‘]["user"]) # hg# print(config[‘DEFAULT‘][‘Compression‘]) #yes# print(config[‘topsecret.server.com‘][‘ForwardX11‘]) #no# print(config[‘bitbucket.org‘]) #<Section: bitbucket.org># for key in config[‘bitbucket.org‘]: # 注意,有default會預設default的鍵# print(key)# print(config.options(‘bitbucket.org‘)) # 同for迴圈,找到‘bitbucket.org‘下所有鍵# print(config.items(‘bitbucket.org‘)) #找到‘bitbucket.org‘下所有索引值對# print(config.get(‘bitbucket.org‘,‘compression‘)) # yes get方法Section下的key對應的value
三. logging模組
# 功能 # 1. 日誌格式的規範 # 2. 操作的簡化 # 3. 日誌的分級管理# logging不能幫你做的事情 # 自動產生你要列印的內容# 需要程式員自己在開發的時候定義好 : # 在哪些地方需要列印,要列印的內容是什麼,內容的層級# logging模組的使用 : # 普通配置型 簡單的 可定製化差 # 對象配置型 複雜的 可定製化強# 認識日誌分級# import logging# logging.debug(‘debug message‘) # 偵錯模式# logging.info(‘info message‘) # 基礎資訊# logging.warning(‘warning message‘) # 警告# logging.error(‘error message‘) # 錯誤# logging.critical(‘critical message‘)# 嚴重錯誤
日誌資訊在螢幕上顯示
import logginglogging.basicConfig(level=logging.DEBUG) # 若是沒有設定 level=logging.DEBUG 參數, debug(調試資訊)和info(基礎資訊)不會被列印顯示logging.debug(‘debug message‘) # 偵錯模式logging.info(‘info message‘) # 基礎資訊logging.warning(‘warning message‘) # 警告logging.error(‘error message‘) # 錯誤logging.critical(‘critical message‘)# 嚴重錯誤# DEBUG:root:debug message# INFO:root:info message# WARNING:root:warning message# ERROR:root:error message# CRITICAL:root:critical message
日誌還能寫在檔案裡, 但是不能同時顯示在螢幕上
# 把日誌顯示在檔案裡, 日誌格式import logginglogging.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‘) # filename參數是檔案的名字logging.debug(‘debug message‘) # 偵錯模式logging.info(‘info message‘) # 基礎資訊logging.warning(‘warning message‘) # 警告logging.error(‘error message‘) # 錯誤logging.critical(‘critical message‘)# 嚴重錯誤
日誌配置參數:
logging.basicConfig()函數中可通過具體參數來更改logging模組預設行為,可用參數有:filename:用指定的檔案名稱建立FiledHandler,這樣日誌會被儲存在指定的檔案中。filemode:檔案開啟檔案,在指定了filename時使用這個參數,預設值為“a”還可指定為“w”。format:指定handler使用的日誌顯示格式。datefmt:指定日期時間格式。level:設定rootlogger(後邊會講解具體概念)的記錄層級stream:用指定的stream建立StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者檔案(f=open(‘test.log’,’w’)),預設為sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。format參數中可能用到的格式化串:%(name)s Logger的名字%(levelno)s 數字形式的記錄層級%(levelname)s 文本形式的記錄層級%(pathname)s 調用日誌輸出函數的模組的完整路徑名,可能沒有%(filename)s 調用日誌輸出函數的模組的檔案名稱%(module)s 調用日誌輸出函數的模組名%(funcName)s 調用日誌輸出函數的函數名%(lineno)d 調用日誌輸出函數的語句所在的程式碼%(created)f 目前時間,用UNIX標準的表示時間的浮 點數表示%(relativeCreated)d 輸出日誌資訊時的,自Logger建立以 來的毫秒數%(asctime)s 字串形式的目前時間。預設格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒%(thread)d 線程ID。可能沒有%(threadName)s 線程名。可能沒有%(process)d 進程ID。可能沒有%(message)s使用者輸出的訊息
配置參數
logging對象動作記錄檔案步驟
# logger對象的形式來動作記錄檔案# 建立一個logger對象# 建立一個檔案管理操作符# 建立一個螢幕管理操作符# 建立一個日誌輸出的格式# 檔案管理操作符 綁定一個 格式# 螢幕管理操作符 綁定一個 格式# logger對象 綁定 檔案管理操作符# logger對象 綁定 螢幕管理操作符
import logging# 建立一個logger對象logger = logging.getLogger()# 建立一個檔案管理操作符fh = logging.FileHandler(‘logger.log‘,encoding=‘utf-8‘)# 建立一個螢幕管理操作符sh = logging.StreamHandler()# 建立一個日誌輸出的格式format1 = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)# 檔案管理操作符 綁定一個 格式fh.setFormatter(format1)# 螢幕管理操作符 綁定一個 格式sh.setFormatter(format1)logger.setLevel(logging.DEBUG)# logger對象 綁定 檔案管理操作符# logger.addHandler(fh)# logger對象 綁定 螢幕管理操作符logger.addHandler(sh)logger.debug(‘debug message‘) # 偵錯模式logger.info(‘我的資訊‘) # 基礎資訊logger.warning(‘warning message‘) # 警告logger.error(‘error message‘) # 錯誤logger.critical(‘critical message‘)# 嚴重錯誤# 2018-08-10 19:35:36,980 - root - DEBUG - debug message# 2018-08-10 19:35:36,980 - root - INFO - 我的資訊# 2018-08-10 19:35:36,980 - root - WARNING - warning message# 2018-08-10 19:35:36,980 - root - ERROR - error message# 2018-08-10 19:35:36,980 - root - CRITICAL - critical message
python模組: hashlib模組, configparse模組, logging模組