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")) # 从字符开始匹配数字只匹配一个
原文地址:https://www.cnblogs.com/jutao/p/9863510.html