一、hashlib模块
什么是哈希模块:
hashlib模块是一种加密模块,内部存有多种加密类型
加密的作用:
可将明文数据进行加密,转换成一串密文,密文越长说明文件加密的越复杂
加密算法的种类:
- md5
- base64
- hmac
- sha系列(sha1、sha224、sha256等等)
补充说明:
1.算法不变,如果内容相同,那么加密的结果肯定相同
2.待加密的明文,可以一次传入,也可分多次传入,不会影响密文的结果
3.加密的结果是无法反解密的
4.加盐处理:
- 4.1.加盐处理的意思是指:在明文内加入干扰项,可改变密文的结果,来提高被加密的安全性
- 4.2.动态加盐:指干扰项是动态的,在加盐的基础上更大程度上提高被加密文件的安全性
应用方向:
用户密码加密
- 可应用于用户登录时,对密码的加密
文件安全性校验
- 可对文件进行加密,通过比对文件的密文来判断文件是否被修改
基本操作与用法
导入模块:
1 | 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管道
要注意的是,这个模块的返回结果只能让开发者看一次,如果想多次查看,需要在第一次输出的时候,把所有信息写入到变量中。
基本操作与用法
模块导入:
1 | import subprocess |
基本格式:
1 2 3 4 | subprocess.Popen( '命令' , shell = True , stdout = subprocess.PIPE, stderr = subprocess.PIPE) |
- shell=True 表示要在终端中运行的命令
- stdout=sbuprocess.PIPE 表示当命令存在的时候,把结果写入到stdout管道
- stderr=sbuprocess.PIPE 表示当命令不存在的时候,把结果吸入到stderr管道
具体用法:
1 2 3 4 | 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日志模块,内置方法与代码相对固定,在使用时,只需根据个人要求,对内部变量稍作修改即可使用
基本操作与用法
导入模块:
1 | import logging |
打印日志级别:
1 2 3 4 5 6 7 8 9 | 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 级别的日志。
代码用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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" ) |
日志模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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( '慢男 猛男 骚男' ) |
以上就是Python基础之hashlib模块subprocess模块logging模块的详细内容,更多关于Python hashlib subprocess logging的资料请关注IT俱乐部其它相关文章!