Python基础之hashlib模块subprocess模块logging模块
作者:Kkkkangsh 发布时间:2022-08-12 02:45:52
一、hashlib模块
什么是哈希模块:
hashlib模块是一种加密模块,内部存有多种加密类型
加密的作用:
可将明文数据进行加密,转换成一串密文,密文越长说明文件加密的越复杂
加密算法的种类:
md5
base64
hmac
sha系列(sha1、sha224、sha256等等)
补充说明:
1.算法不变,如果内容相同,那么加密的结果肯定相同
2.待加密的明文,可以一次传入,也可分多次传入,不会影响密文的结果
3.加密的结果是无法反解密的
4.加盐处理:
4.1.加盐处理的意思是指:在明文内加入干扰项,可改变密文的结果,来提高被加密的安全性
4.2.动态加盐:指干扰项是动态的,在加盐的基础上更大程度上提高被加密文件的安全性
应用方向:
用户密码加密
可应用于用户登录时,对密码的加密
文件安全性校验
可对文件进行加密,通过比对文件的密文来判断文件是否被修改
基本操作与用法
导入模块:
import hashlib
具体用法:
1、选择加密算法:
md5 = hashlib.md5()2、传入明文:
md5.update(b'hello')
# 传入的明文需提前转换成二进制的方式3、获取加密密文:
res = md5.hexdigets()
print(res)
# 5d41402abc4b2a76b9719d911017c592
二、subprocess模块简介
什么是subprocess模块:
subprocess是python内置的模块,这个模块中的Popen可以查看用户输入的命令行是否存在
如果存在,把内容写入到stdout管道中
如果不存在,把信息写入到stderr管道
要注意的是,这个模块的返回结果只能让开发者看一次,如果想多次查看,需要在第一次输出的时候,把所有信息写入到变量中。
基本操作与用法
模块导入:
import subprocess
基本格式:
subprocess.Popen('命令',
shell = True,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
shell=True 表示要在终端中运行的命令
stdout=sbuprocess.PIPE 表示当命令存在的时候,把结果写入到stdout管道
stderr=sbuprocess.PIPE 表示当命令不存在的时候,把结果吸入到stderr管道
具体用法:
import subprocess
r = subprocess.Popen('xxxx', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(r.stdout.read().decode('utf8'))
print(r.stderr.read().decode('utf8'))
三、logging模块简介
什么是logging模块:
loggin模块是用来写日志的,以前我们写日志需要自己往文件里写记录信息,使用了logging之后我们只需要一次配置好,以后写日志的事情都不需要我们操心了,非常方便
日志的组成:
产生日志
过滤日志
输出日志
日志格式
日志的等级:
DEBUG
最详细的日志信息,典型应用场景是 问题诊断
INFO
信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING
当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR
由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL
当发生严重错误,导致应用程序不能继续运行时记录的信息
掌握层度:
longging日志模块,内置方法与代码相对固定,在使用时,只需根据个人要求,对内部变量稍作修改即可使用
基本操作与用法
导入模块:
import logging
打印日志级别:
logging.debug('Python debug')
logging.info('Python info')
logging.warning('Python warning')
logging.error('Python Error')
logging.critical('Python critical')
-------------------------------------------------------------------
WARNING:root:Python warning
ERROR:root:Python Error
CRITICAL:root:Python critical
当指定一个日志级别之后,会记录大于或等于这个日志级别的日志信息,小于的将会被丢弃, 默认情况下日志打印只显示大于等于 WARNING 级别的日志。
代码用法:
import logging
logger = logging.getLogger("simple_example")
logger.setLevel(logging.DEBUG)
# 建立一个filehandler来把日志记录在文件里,级别为debug以上
fh = logging.FileHandler("spam.log")
fh.setLevel(logging.DEBUG)
# 建立一个streamhandler来把日志打在CMD窗口上,级别为error以上
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 设置日志格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
ch.setFormatter(formatter)
fh.setFormatter(formatter)
#将相应的handler添加在logger对象中
logger.addHandler(ch)
logger.addHandler(fh)
# 开始打日志
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")
日志模板:
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 = 'a3.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,
# 这里两个参数的意思是一个日志文件最多写5M,最多可以存在五个不同的日志文件,但是当数量达到五个之后就会出现最早的那个会被删除,
# 然后再产生一个新的文件(类似于覆盖了最早的那个文件)
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
# logging.getLogger(__name__)拿到的logger配置
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
# '购物车记录': {
# 'handlers': ['default','console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
# 'level': 'WARNING',
# 'propagate': True, # 向上(更高level的logger)传递
# }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
},
}
logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置
# logger1 = logging.getLogger('购物车记录')
# logger1.warning('尊敬的VIP客户 晚上好 您又来啦')
# logger1 = logging.getLogger('注册记录')
# logger1.debug('jason注册成功')
logger1 = logging.getLogger('红浪漫顾客消费记录')
# 当这里的getLogger内部的参数如果字典中没有,就会自动使用字典中名称为空的那个模版来执行
logger1.debug('慢男 * 骚男')
来源:https://www.cnblogs.com/kangssssh/p/16834243.html


猜你喜欢
- 测试代码1:def test(self): data = {"add": {"doc":
- vue实现一个分页组件vue-paginaitonvue使用了一段时间的感触就是,我再也不想直接操作DOM了。数据绑定式的编程体验真是好。实
- 一、需求说明需要使用Python实现将内容转为base64编码,解码,方便后续的数据操作。二、base64简介Base64是一种二进制到文本
- 在工作中碰到这么一个问题:给定一个已经排序的数组(升序),删除数组中重复的数据,但是只能使用一个数组,这个数组的大小可以变化. 例子:&nb
- 背景介绍#ubuntu 20.04 版本系统自带的 MySQL 版本是 8.0,普通方法很难安装 5.7 版本的。由于 8.0 版本较 5.
- 1. 扩展Tensor维度相信刚接触Pytorch的宝宝们,会遇到这样一个问题,输入的数据维度和实验需要维度不一致,输入的可能是2维数据或3
- 本文实例讲述了Python计时相关操作。分享给大家供大家参考,具体如下:内容目录:1. 时间戳2. 当前时间3. 时间差4. python中
- 1.能调用方法的一定是对象,比如数值、字符串、列表、元组、字典,甚至文件也是对象,Python中一切皆为对象。 str1 = 'he
- 使用 os.open 打开文件无论是读文件还是写文件,都要先打开文件。说到打开文件,估计首先想到的就是内置函数 open(即 io.open
- 0、背景今天看到了一个比较诡异的写法,for后直接跟了else语句,起初还以为是没有缩进好,查询后发现果然有这种语法,特此分享。之前写过c+
- 1查看Linux发行版本[root@typecodes ~]# cat /etc/redhat-releaseCentOS Linux re
- 准备篇:CentOS 6.6系统安装配置图解教程https://www.jb51.net/os/239738.html一、配置防火墙,开启8
- 学习前言在Github上我们可以看到许多模型,他们都有mAP值的评价指标,如下图所示:这到底是个啥呢?我查了好久的资料&hellip
- 二、基本概念1、数据库数据库(DB):即DataBase的缩写,是按照一定的数据结构来组织、存储和管理数据的一个仓库。是存储在一起的相关数据
- 本文实例为大家分享了用python实现五子棋的具体代码,供大家参考,具体内容如下# 制作一个棋盘"""++++
- 前言参考文章:Python实现照片卡通化我继续魔改一下,让该模型可以支持将gif动图或者视频,也做成卡通化效果。毕竟一张图可以那就带边视频也
- Java 正则表达式判断字符串是否以字符开始:public static boolean startWithChar(String s) {
- 一、renderer<meta name="renderer" content="webkit|ie-c
- 前奏为了能操作数据库, 首先我们要有一个数据库, 所以要首先安装Mysql, 然后创建一个测试数据库python_test用以后面的测试使用
- 之前公司有套C# AES加解密方案,但是方案加密用的是Rijndael类,而非AES的四种模式(ECB、CBC、CFB、OFB,这四种用的是