python常用模块:logging、hashlib、re
本文目录:
一、logging模块
二、logging模块的使用
三、hashlib模块
四、re模块
一、logging模块
import logging # 1 日志的级别 logging.debug("这是一个调试信息") # 10 logging.info("常规信息") # 20 logging.warning("警告信息") # 30 ogging.error("错误信息") # 40 logging.critical("严重错误") # 50 # # 在logging模块中有对应的常量用来表示级别 # 默认情况下 默认的级别30 WARNING 日志的位置是控制台 # # 2 自定义日志的配置 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("这又是一个调试信息") # #日志模块的四个核心对象 """ 1.logger 日志生成器 2.filter 过滤器 3.handler 处理器 4.formater 格式处理器 """ # #1.创建一个日志生成器 mylog = logging.getLogger("mylog") mylog.setLevel(logging.DEBUG) # # 2.建一个日志处理器 fh = logging.FileHandler("b.long",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") #默认值为True标识 有继承关系 当子的日志产生日志是 给他的父级以及父级以上都发了一份 #如果不需要就设置False #log3.propagate = False fh = logging.FileHandler("c.long",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") log1.warning("father.son.log") log3.warning("father.son.grandson")
二、logging模块的使用
import logging.config #以字典来配置文件 传入一个字典对象 就不需要在编写上面那一堆代码 logging.config.dictConfig() #流处理器 log1 = logging.getlogger("a") #输出到文件 fh = logging.StreamHandler() #输出到控制台 sh = logging.StreamHandler() log1.addHandler(sh) log1.addHandler(fh) fm = logging.Formatter( "%(asctime)s %(levelname)S %(funcName)s %(lineno)s %(message)s", datetime = "%Y-%m-%d %X %p") sh.selfFormatter(fm) log1.warning("测试2") import lib.common logger = lib.common.log() def login(): logger.debug("测试 测试!") login()
srtting文件
standard_format="%(asctime)s %(levelname)S %(funcName)s %(lineno)s %(message)s" simple_format="%(asctime)s %(message)s" complete_format="%(asctime)s %(levelname)S %(funcName)s %(lineno)s %(thread)s %(process)s %(message)s" logfile_path = r"d.log" LOGGING_DIC = { 'version': 1, 'formatters': { 'standard': { 'format': standard_format }, 'simple': { 'format': simple_format }, "complete":{ "format": complete_format } }, 'filters': {}, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'simple' }, 'default': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', 'formatter': 'standard', 'filename': logfile_path, # 'maxBytes': 1024 * 1024 * 5, # 日志文件的最大大小为5M 超出后 换文件 'backupCount': 5, # 最多留五个日志文件 'encoding': 'utf-8', }, }, 'loggers': { # 在getLogger的时候 如果指定的名称 不存在 或者不给名称 用的就是默认的 # 在这里如果key为空 它就是默认的 # 你可以自己定义生成器的名称 并且他们还能使用相同的默认配置 '': { 'handlers': ['default', 'console'], 'level': 'DEBUG', 'propagate': False, }, }, }
三、hashlib模块
"""
hash lib
hash是一种算法 是将一个任意长的数据 根据计算 得到一个固定长度特征码
特征: 不同输入 可能会有相同的结果 几率特别小
相同的输入 必然得到相同结果
由于散列(特征)的性质 从原理来看是不可能 反解
hash lib
hash是一种算法 是将一个任意长的数据 根据计算 得到一个固定长度特征码
特征: 不同输入 可能会有相同的结果 几率特别小
相同的输入 必然得到相同结果
由于散列(特征)的性质 从原理来看是不可能 反解
用来 验证 两个输入的数据是否一致
使用场景
1.密码验证
123321 jahsajshajhsjahjas
使用场景
1.密码验证
123321 jahsajshajhsjahjas
client 加密后结果 server 拿到加密后
2.验证数据是否被篡改 比如游戏安装包 有没有被改过
为了防止别人撞库成功 可用提升密码的复杂度 其次可以为密码加盐 (加点内容进去)
"""
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())
四、re模块
"""
re模块
主要正则表达式相关
什么是正则表达式 一堆带有特殊意义的符号组成式子
它的作用 处理(匹配 查找 替换 )字符串
1.
在爬虫中大量使用 其实有框架帮你封装了这些复杂的正则
2.
在网站和手机app的注册功能中大量使用 例如判断你的邮箱地址是否正确
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*")) # 匹配任意数字 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")) # 匹配中括号内0-9的数字 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","0s1asasas121 \t")) # 从字符开始匹配数字