2018.10.18學習總結
1"""
hash lib
hash是一種算法 是將一個任意長的數據 根據計算 得到一個固定長度特征碼
特征: 不同輸入 可能會有相同的結果 幾率特別小
相同的輸入 必然得到相同結果
由於散列(特征)的性質 從原理來看是不可能 反解
用來 驗證 兩個輸入的數據是否一致
使用場景
1.密碼驗證
123321 jahsajshajhsjahjas
client 加密後結果 server 拿到加密後
2.驗證數據是否被篡改 比如遊戲安裝包 有沒有被改過
為了防止別人撞庫成功 可用提升密碼的復雜度 其次可以為密碼加鹽 (加點內容進去)
"""
import hashlib
m = hashlib.md5("aaa".encode("utf-8"))
print(len(m.hexdigest()))
# 撞庫破解的原理 有人事先 把常見的 明文和密文的對應關系 存到了數據庫中
# 運氣好就能查詢到
pwds = {"aaa":"47bce5c74f589f4867dbd57e9ca9f808"}
h1 = hashlib.sha512("123".encode("utf-8"))
h2 = hashlib.sha3_512("123".encode("utf-8"))
# print(len(h.hexdigest()))
print(h1.hexdigest())
print(h2.hexdigest())
# 2b70683ef3fa64572aa50775acc84855
# 加鹽
m = hashlib.md5("321".encode("utf-8"))
#加
m.update("abcdefplkjoujhh".encode("utf-8"))
print(m.hexdigest())
import hmac
# 沒啥區別 只是在創建的時候必須加鹽
h = hmac.new("abcdefjjjj".encode("utf-8"))
h.update("123".encode("utf-8"))
print(h.hexdigest())
2logging模塊看文件包內容
import logging
# 1.日誌的級別
# logging.debug("這是一個調試信息") # 10
# logging.info("常規信息") # 20
# logging.warning("警告信息") # 30#直接可以打印到終端不過默認級別是30
# logging.error("錯誤信息") # 40
# logging.critical("嚴重錯誤") # 50
# 在logging模塊中有對應的常量用來標識級別
# 默認情況下 默認的級別30 WARNING 日誌輸出位置是控制臺
# 2.自定定義日誌的配置
# logging.basicConfig(#創造一個a.log文件
# filename = "a.log",
# filemode ="at",
# level = 10,
# format ="%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
# datefmt="%Y-%m-%d %X %p"
#
# )
# logging.debug("這又是調試信息")#會寫入文件
# 日誌模塊的四個核心角色
"""
1.logger 日誌生成器
2.filter 過濾器
3.handler 處理器
4.formatter 格式處理器
"""
# 1.創建一個日誌生成器
# mylog = logging.getLogger("mylog")
# # 設置生成器級別
# mylog.setLevel(logging.DEBUG)
#
# # 2.搞一個日誌處理器
# fh = logging.FileHandler("b.log",encoding="utf-8")
#
# # 3.搞一個格式處理器
# fm = logging.Formatter(
# "%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
# datefmt="%Y-%m-%d %X %p")
#
# # 4.將 三個對象進行關聯
# mylog.addHandler(fh)
# fh.setFormatter(fm)
# 測試
# mylog.debug("mylog 的 測試!")
# log1 = logging.getLogger("father")
# log2 = logging.getLogger("father.son")
# log3 = logging.getLogger("father.son.grandson")#去掉father就找不到父集就只打印一條信息
#
# # 默認值True 標識 有繼承關系 當子的日誌產生日誌時 給他父級以及父級以上都發一份
# # 如果不需要繼承關系就設置False
# log3.propagate = False
#
# fh = logging.FileHandler("c.log",encoding="utf-8")
# fm = logging.Formatter(
# "%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
# datefmt="%Y-%m-%d %X %p")
# log1.addHandler(fh)
# log2.addHandler(fh)
# log3.addHandler(fh)
# fh.setFormatter(fm)
#
# log1.warning("father log")
# log2.warning("father.son log")
# log3.warning("father.son.grandson log")#可以找到父級就會打印3條不然就打印一條,或者直接log3.propagate = False不繼承
# import logging.config
# 以字典來配置日誌 傳入一個字典對象 就不需要在編寫上面那一堆代碼
# logging.config.dictConfig()
# 流處理器
log1 = logging.getLogger("a")
# 輸出到文件
fh = logging.FileHandler("c.log",encoding="utf-8")
# d =logging.FileHandler(r"C:\Users\jtyaole\PycharmProjects\untitled\logger10_25\conf\e.log",encoding="utf-8")
# log1.addHandler(d)
# 輸出到控制臺
# sh = logging.StreamHandler()
# log1.addHandler(sh)
log1.addHandler(fh)
fm = logging.Formatter(
"%(asctime)s %(levelname)s %(funcName)s %(lineno)s %(message)s",
datefmt="%Y-%m-%d %X %p")
# d.setFormatter(fm)
# sh.setFormatter(fm)
fh.setFormatter(fm)
log1.warning("測試2!")
# logger = lib.common.get_logger()
#
# def login():
# logger.debug("測試 測試!")
#
# login()
3"""
re模塊
主要正則表達式相關
什麽是正則表達式 一堆帶有特殊意義的符號組成式子
它的作用 處理(匹配 查找 替換 )字符串
1.
在爬蟲中大量使用 其實有框架幫你封裝了這些復雜的正則
2.
在網站和手機app的註冊功能中大量使用 例如判斷你的郵箱地址是否正確
"""
import re
# ===============================單個字符匹配=========
print(re.findall("\n","1\n")) # 匹配換行符
print(re.findall("\t","1asasas121 \t")) # 匹配制表符
# ========================範圍匹配===========
print(re.findall("\w","1aA_*")) # 匹配數字字母下劃線
print(re.findall("\W","1aA_*,")) # 匹配非數字字母下劃線
print(re.findall("\s"," \n\r\t\f")) # 匹配任意空白字符
print(re.findall("\S"," \n\r\t\f")) # 匹配任意非空白字符
print(re.findall("\d","123abc1*")) # 匹配任意數字,等價於[0-9]
print(re.findall("\D","123abc1*")) # 匹配任意非數字
# print(re.findall("[abc]","AaBbCc")) # 匹配 a b c都行
# print(re.findall("[^abc]","AaBbCc")) # 除了 a b c都行
# print(re.findall("[0-9]","AaBbCc12349")) # 除了 a b c都行
print(re.findall("[a-z]","AaBbCc12349")) # a-z 英文字母
print(re.findall("[A-z]","AaBbC:c??2349[]")) # A-z 匹配原理 是按照ascII碼表
# =========================匹配位置======
print(re.findall("\A\d","123abc1*")) # 從字符串的開始處匹配只匹配一個沒有輸出空
print(re.findall("\d\Z","123abc1*9\n")) # 從字符串的結束處匹配 註意把\Z寫在表達式的右邊,只匹配一個沒有輸出空
print(re.findall("\d$","123abc1*9")) # 從字符串的結束處匹配 如果末尾有換行 換行不會參與匹配
print(re.findall("^\d","s1asasas121 \t")) # 從字符開始匹配數字只匹配一個
2018.10.18學習總結