python 内置模块补充

1、hashlib模块

hash模块的作用主要是对数据进行加密,我们在平时登录的时候,大部分后台一般会对我们的密码等私密信息进行加密

  • 加密:将明文数据通过一系列的算法变成密文数据,这样做提升了数据的安全性

  • 加密算法:md系列、sha系列、base系列、hamc系列

  • 常用的算法类型及方法:

    • hashlib.md5()
    • md5.uppdate():uppdate只能接收bytes类型的数据,所以在传送数据的时候要编码(encode)
    • hexdigest():生成一串没有规则的随机字符串
  • 注意:加密之后的密文数据是无法解密成明文数据(除非你很牛逼),涉及到用户密码等隐私信息,其实都是密文,只有用户自己知道明文是什么,内部程序员无法得知明文数据,数据泄露也无法得知明文数据

简易使用:

import hashlib

# 先确定算法类型(md5普遍使用)
md5 = hashlib.md5()
# 加密的数据
data = '人生苦短我用python'
# 转化为bytes
data1 = data.encode('utf8')
# uppdate接收数据
md5.update(data1)
# 加密操作
res = md5.hexdigest()
print(res)
# result
# 007f910ee8215e9e229cc4fba38665da '''如果明文数据相同,不管分几次传入,加密的结果肯定是一样的'''
# 将data拆分开传入
import hashlib # 先确定算法类型(md5普遍使用)
md5 = hashlib.md5()
# 加密的数据
data = '人生苦短我用python' # uppdate接收数据
md5.update('人生苦短'.encode('utf8'))
md5.update('我用python'.encode('utf8'))
# 加密操作
res = md5.hexdigest()
print(res)
# result
# 007f910ee8215e9e229cc4fba38665da
# 007f910ee8215e9e229cc4fba38665da
'''将data分成两部分传入,发现加密后的密文数据一样'''

高级使用:

生成复杂密文,密文越长,内部对应的算法越复杂,越难破解

import hashlib
# 使用sha256算法
sha256 = hashlib.sha256()
sha256.update('人生苦短我用python'.encode('utf8'))
res = sha256.hexdigest()
print(res)
# 使用md5加密后的结果
# 007f910ee8215e9e229cc4fba38665da
# 使用sha256加密的结果
# f1ae8a91ef9decce9715bd555111fc9e4b7c7e4f9dd962b32b3668a1ac2e4e6c '''发现使用sha256加密,获取的密文更长
优点:密文更长,越复杂,越不容易被破解
缺点:消耗的资源会更多,密文越长基于网络发送需求占据的数据也越大'''

进阶使用:

加盐处理:

  • 普通加盐

  • 动态加盐

  • 加盐处理:就是对明文数据处理做加密的过程前加一些干扰项,使得数据更加的安全,不容易被破解

示例如下:

import hashlib
md5 = hashlib.md5()
# 获取加密的数据
md5.update('python'.encode('utf8'))
# 加盐处理
md5.update('加点干扰才更加安全'.encode('utf8'))
# 加密处理
res = md5.hexdigest()
print(res) # 为加盐的结果23eeeb4347bdd26bfc6b7ee9a3b755dd
# 加盐的结果c51a058dc11f6c52e3110a8cbf6b6c6e '''不加盐python明文加密的结果和加盐的结果不一样,这样就算破解了也不是真实数据'''
  • 动态加盐操作

    上面的写法就写死了,只能固定加盐的内容,我们如果可以不断变换加盐的内容,这样是不是更加安全

通过获取动态的数据,来实现加盐内容的变换

import hashlib
import time
# 确定加密的算法
md5 = hashlib.md5()
# 获取加密的数据
data = 'python'.encode('utf8')
# 动态加盐
'''通过获取时间戳,来使得盐的内容都不一样'''
interference = str(time.time())
md5.update(data)
md5.update(interference.encode('utf8'))
res = md5.hexdigest()
print(res)
# 取三次结果
'''
edb6fbf75df039a7cc77a0b641591558
51ed4a4d4428308001a8ea993002a9cc
2e5d90eb45fd53228a7c501d6ecebb3f
'''

校验文件一致性

文件不是很大的时候,可以直接加密处理,如果文件很大的时候,想全部加密处理,可以通过切片读取的方式来加密

注意:文件要使用二进制的模式,因为加密操作是针对bytes类型!

小文件直接加密

# 校验文件的一致性
# 小文件直接加密
import hashlib
# 获取使用的算法
md5 = hashlib.md5()
with open(r'a.txt','rb') as f:
for oneline in f:
md5.update(oneline)
res = md5.hexdigest()
print(res)
# 结果
# 8d3eade70c8a8243554980488263fcc7
# cadd64f0bc5c34e40c151e7ed78a12a6
# d892ad2413f01d4ae0a18ce9b5367f29
'''
a.txt文件的内容
python123
python456
python789
'''
# 如果修改文件内容加密后的密文也会改变,修改最后一行发现前两行一样最后一行不一样
import hashlib
# 获取使用算法
md5 = hashlib.md5()
with open(r'a.txt','rb') as f:
for oneline in f:
md5.update(oneline)
res = md5.hexdigest()
print(res)
# 结果
'''
8d3eade70c8a8243554980488263fcc7
cadd64f0bc5c34e40c151e7ed78a12a6
8a149d9358818b4709f84ede3ed59f84
'''

大文件加密

# 大文件加密
import os
import hashlib
# 获取算法
md = hashlib.md5()
# 读取文件总大小
file_size= os.path.getsize(r'a.txt') # 33
# 指定分片的读取策略,每段读取几个字节
read_seg = [0,file_size//4,file_size//2,file_size-10]
with open(r'a.txt','rb')as f:
for oneline in read_seg:
f.seek(oneline)
md.update(f.read(5))
print(md.hexdigest())
# 结果
'''
d3b2be2dd2a6dfdc6a07f2c14cbfa763
762a12f9502b4f39d70456508f9a833a
b6f58f4ad6bb0d2539c715f5cd95c919
9b1ff33821e93423b997d9dbb0fa8091
'''

2、logging日志模块

[python官网版本](日志记录 — Python 的日志记录工具 — Python 3.10.0 文档)

这个模块定义了为应用程序和库实现灵活时间日志记录的函数和类!

日志等级

水平 数值
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
NOTSET 0

注意:默认记录的级别在30以上

常用处理

  • logging.debug(‘debug级别’)
  • logging.info(‘info级别’)
  • logging.warning(‘warning级别’)
  • logging.error(‘error级别’)
  • logging.critical(‘critical级别’)

“四大天王”

logger对象、filter对象、handler对象、formatter对象

简单使用

import logging
# 写入文件
# file_handler = logging.FileHandler(filename='log1.log',mode='a',encoding='utf8')
# 当前输出
file_now = logging.StreamHandler()
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[file_now,],
level=logging.ERROR
)
logging.error('日志模块')
# 结果
# 2021-11-29 16:49:58 PM - root - ERROR -3logging模块: 日志模块 # 在文件和终端同时显示
import logging
# 写入文件
file_handler = logging.FileHandler(filename='log1.log',mode='a',encoding='utf8')
# 当前输出
file_now = logging.StreamHandler()
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[file_now,file_handler],
level=logging.ERROR
)
logging.error('日志模块')

日志模块详细介绍

'''要求:
1、想在文件和终端中同时打印
2、不同位置如何做到不同的日志格式,文件详细一些 终端简单一些
'''
import logging # 1.logger对象:负责产生日志
logger = logging.getLogger('转账记录')
# 2.filter对象:负责过滤日志(直接忽略)
# 3.handler对象:负责日志产生的位置
hd1 = logging.FileHandler('a1.log',encoding='utf8') # 产生到文件的
hd2 = logging.StreamHandler() # 产生在终端的
# 4.formatter对象:负责日志的格式
fm1 = logging.Formatter(
fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
)
fm2 = logging.Formatter(
fmt='%(asctime)s - %(name)s %(message)s',
datefmt='%Y-%m-%d',
)
# 5.绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
# 6.绑定formatter对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2) # 7.设置日志等级
logger.setLevel(10)
# 8.记录日志
logger.debug('终端显示')
# 结果
# 2021-11-29 - 转账记录 终端显示

配置字典

import logging
import logging.config standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' logfile_path = 'log_dic.log'
# log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {}, # 过滤日志
'handlers': {
#打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件,(可以修改)
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置 空字符串作为键 能够兼容所有的日志
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
},
} # 使用配置字典
logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置
logger1 = logging.getLogger('日志类型')
logger1.debug('显示内容')
# 结果
#[DEBUG][2021-11-29 17:05:34,754][匹配字典.py:56]显示内容

第三方模块

第三方模块需要下载

下载方式:

如果遇到下载报错,报错的原因有以下几点:

  1. 错误信息有timeout关键字,网络不稳定
  2. 找不到pip命令,添加到环境变量或者切换路径下载
  3. pip下载某个模块报错,没有任何关键字的提示,那就百度吧,哈哈哈~

python 内置模块续(二)的更多相关文章

  1. python内置模块(4)

    这一部分是python内置模块系列的最后一部分,介绍了一些小巧有用的内置模块. 目录: 1.random 2.shelve 3.getpass 4.zipfile 5.tarfile 6.bisect ...

  2. Python 基础语法(二)

    Python 基础语法(二) --------------------------------------------接 Python 基础语法(一) ------------------------ ...

  3. python内置模块[sys,os,os.path,stat]

    python内置模块[sys,os,os.path,stat] 内置模块是python自带功能,在使用内置模块时,需要遵循 先导入在 使用 一.sys 对象 描述 sys.argv 命令行参数获取,返 ...

  4. python模块(二)

    一.json模块 作用: 用于[字符串]和 [python基本数据类型] 间进行转换 Python的Json模块序列化与反序列化的过程分别是 encoding和 decoding. encoding ...

  5. python内置模块介绍(一)

     本文主要介绍模块列表如下: os sys re time datetime random shutil subprocess os模块 os.getcwd()                    ...

  6. python排序之二冒泡排序法

    python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...

  7. Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识

    Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...

  8. 初学 Python(十二)——高阶函数

    初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 ...

  9. python/MySQL练习题(二)

    python/MySQL练习题(二) 查询各科成绩前三名的记录:(不考虑成绩并列情况) select score.sid,score.course_id,score.num,T.first_num,T ...

随机推荐

  1. 蝉知CMS 7.X XSS漏洞复现

    个人博客地址:xzajyjs.cn 作为一个开源的企业门户系统(EPS), 企业可以非常方便地搭建一个专业的企业营销网站,进行宣传,开展业务,服务客户.蝉知系统内置了文章.产品.论坛.评论.会员.博客 ...

  2. find+xargs+sed批量替换

    写代码时经常遇到要把 .c  和 .h的文件中的某些内容全部替换的情况,用sourceinsight 进行全局的查找是一个方法,但是sourceinsight只能替换一个文件中的字符串,不能同时替换多 ...

  3. Less-(38~41) 堆叠注入

    首先申明,Less-(38~41)可以采取和Less-(1~4)相同的解法:(一一对应) 然而,他们的漏洞其实更大,我们可以做更多具有破坏性的事情. 代码审计: Less-(38~41): 41的$s ...

  4. 改善深层神经网络-week1编程题(Initializaion)

    Initialization 如何选择初始化方式,不同的初始化会导致不同的结果 好的初始化方式: 加速梯度下降的收敛(Speed up the convergence of gradient desc ...

  5. Spring Cloud Gateway 网关限流

    Spring Cloud Gateway 限流 一.背景 二.实现功能 三.网关层限流 1.使用默认的redis来限流 1.引入jar包 2.编写配置文件 3.网关正常响应 4.网关限流响应 2.自定 ...

  6. 生产环境部署springcloud微服务启动慢的问题排查

    今天带来一个真实案例,虽然不是什么故障,但是希望对大家有所帮助. 一.问题现象: 生产环境部署springcloud应用,服务部署之后,有时候需要10几分钟才能启动成功,在开发测试环境则没有这个问题. ...

  7. 零基础入门C语言超详细的字符串详解

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...

  8. 【动图解释】关系数据库de关系代数小记

    本文章在 Github 撰写,同时在 我的博客 进行了发布. 最近学数据库概论学到了关系数据库的关系代数了.哎嘛,真的把我整晕了,尤其是关系代数的使用,很容易让人被蒙在鼓里. 对我来说槽点最大的莫过于 ...

  9. idea查看方法在哪里被调用

    方法一 选中方法名,右键选择Find Usages 方法二 选中方法快捷键ctrl + alt + h查看Hierarchy Callers

  10. 全程精髓无废话,腾讯强推Redis深度笔记我粉了

    作为目前主流的NoSQL技术,redis在Java互联网中得到了非常广泛的使用,个时代码代码的秃头人员,对Redis肯定是不陌生的,如果连Redis都没用过,还真不好意思出去面试,指不定被面试官吊打多 ...