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()

 

posted @ 2018-10-18 21:18  凌、云  阅读(196)  评论(0编辑  收藏  举报