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是一种算法  是将一个任意长的数据 根据计算 得到一个固定长度特征码
    特征: 不同输入 可能会有相同的结果 几率特别小
        相同的输入 必然得到相同结果
        由于散列(特征)的性质 从原理来看是不可能 反解
    用来 验证   两个输入的数据是否一致
    使用场景
    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的注册功能中大量使用 例如判断你的邮箱地址是否正确

"""
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"))  # 从字符开始匹配数字

 

 

posted @ 2018-10-22 20:31  仗剑煮大虾  阅读(221)  评论(0编辑  收藏  举报