Python学习的第22天模块之loggin、hashlib、re
一、loggin
1、定义:功能完善的日志模块
2、日志的级别
# logging.debug("这是一个调试信息") # 10
# logging.info("常规信息") # 20
# logging.warning("警告信息") # 30
# logging.error("错误信息") # 40
# logging.critical("严重错误") # 50
# 在logging模块中有对应的常量用来标识级别
# 默认情况下 默认的级别30 WARNING 日志输出位置是控制台
3、.自定定义日志的配置
# logging.basicConfig( # 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("这又是调试信息")
4、日志模块的四个核心角色
""" 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 的 测试!")
5、日志的继承
# log1 = logging.getLogger("father") # log2 = logging.getLogger("father.son") # log3 = logging.getLogger("father.son.grandson") # # # 默认值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")
6以字典来配置日志 传入一个字典对象 就不需要在编写上面那一堆代码
import logging.config
# logging.config.dictConfig()
# 流处理器 log1 = logging.getLogger("a") # 输出到文件 fh = logging.FileHandler("c.log",encoding="utf-8") # 输出到控制台 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") sh.setFormatter(fm) log1.warning("测试2!") import lib.common logger = lib.common.get_logger() def login(): logger.debug("测试 测试!") login()
二、hashlib
1、什么是hash
hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值
如果把hash算法比喻为一座工厂
那传给hash算法的内容就是原材料
生成的hash值就是生产出的产品
2、为何要用hash算法
hash值/产品有三大特性:
(1)、只要传入的内容一样,得到的hash值必然一样
(2)、只要我们使用的hash算法固定,无论传入的内容有多大,
得到的hash值的长度是固定的
(3)、不可以用hash值逆推出原来的内容
基于1和2可以在下载文件时做文件一致性校验
基于1和3可以对密码进行加密
3、如何用
# #1、造出hash工厂 # m=hashlib.md5() # # #2、运送原材料 # m.update('你好啊美丽的'.encode('utf-8')) # m.update('张铭言'.encode('utf-8')) # # #3、产出hash值 # print(m.hexdigest()) #66bcb9758826f562ae8cb70d277a4be9 # #1、造出hash工厂 # m=hashlib.md5('你'.encode('utf-8')) # # #2、运送原材料 # m.update('好啊美丽的张铭言'.encode('utf-8')) # # #3、产出hash值 # print(m.hexdigest()) #66bcb9758826f562ae8cb70d277a4be9
应用一:文件一致性校验 # #1、造出hash工厂 # m=hashlib.sha512('你'.encode('utf-8')) # # #2、运送原材料 # m.update('好啊美sadfsadf丽asdfsafdasdasdfsafsdafasdfasdfsadfsadfsadfsadfasdff的张铭言'.encode('utf-8')) # # # #3、产出hash值 # print(m.hexdigest()) #2ff39b418bfc084c8f9a237d11b9da6d5c6c0fb6bebcde2ba43a433dc823966c # #1、造出hash工厂 # m=hashlib.md5() # # #2、运送原材料 # with open(r'E:\01.mp4','rb') as f: # for line in f: # m.update(line) # #3、产出hash值 # print(m.hexdigest()) #1273d366d2fe2dc57645cc1031414a05 # # 1273d366d2fe2dc57645cc1031414a05
应用一:对明文密码进行加密 # password=input('>>>: ') # # m=hashlib.md5() # m.update('天王盖地虎'.encode('utf-8')) # m.update(password.encode('utf-8')) # print(m.hexdigest()) #95bd6eafefdf51d8b153785f3fb6263d # import hmac m=hmac.new('小鸡炖蘑菇'.encode('utf-8')) m.update('hello'.encode('utf-8')) print(m.hexdigest())
应用二:对明文密码进行加密 # password=input('>>>: ') # # m=hashlib.md5() # m.update('天王盖地虎'.encode('utf-8')) # m.update(password.encode('utf-8')) # print(m.hexdigest()) #95bd6eafefdf51d8b153785f3fb6263d # import hmac) (必须要验证) m=hmac.new('小鸡炖蘑菇'.encode('utf-8')) m.update('hello'.encode('utf-8')) print(m.hexdigest())
三、re
1、什么是正则
正则就是用一系列具有特殊含义的字符组成一套规则,该规则用来描述具有某一特征的字符串,
正则就是用来去一个大的字符串中匹配出符合规则的子字符串
2、为什么要用正则
(1)、用户注册
(2)爬虫程序
3、如何用正则
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*")) # 匹配任意非空白字符 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")) # 从字符开始匹配数字 print()