Python进阶-XVV hashlib模块、configparse模块、logging模块
1、配置相关的configparse模块
配置文件如何组织?python中常见的是将配置文件写成py,然后引入该模块即可。优点是方便访问。 但是也有用类似windows中的ini文件的配置文件,了解即可,这就是configparser模块。
该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。 1) 创建文件
import configparser
config = configparser.ConfigParser()
config['DEFAULT'] = {
'ServerAliveInterval': '',
'Compression': 'yes',
'CompressionLevel': '',
'ForwardX11':'yes'
}
config['funyou.net'] = {'admin': 'funyou'} config['hongsun.com'] = {'Host port': '', 'Forward': 'True'} with open('config.ini', 'w', encoding='utf-8') as config_file:
config.write(config_file)
2) 查找文件
查找文件内容,类似字典的形式
print(config.sections()) # []
config.read('config.ini')
print(config.sections()) # ['funyou.net', 'hongsun.com']
print('bytebong.com' in config) # False
print('funyou.net' in config) # True
print(config['funyou.net']["admin"]) # funyou
print(config['DEFAULT']['Compression']) #yes
print(config['hongsun.com']['ForwardX11']) #yes 自己没有会去找DEFAULT中的,如果没有报错!
print(config['hongsun.com']) # <Section: hongsun.com>
for key in config['hongsun.com']: # 注意,有default会默认default的键
print(key)
print(config.options('funyou.net')) # 同for循环,找到'funyou.net'下所有键(包含默认组中的)
print(config.items('funyou.net')) # 找到'funyou.net'下所有键值对(包含默认组中的)
print(config.get('funyou.net','compression')) # yes get方法Section下的key对应的value
3)增删改操作
config.add_section('typhoon.org')
config.remove_section('funyou.net')
config.remove_option('typhoon.org',"forwardx11")
config.set('typhoon.org','admin','typhoon')
config.set('typhoon.org', 'super admin', 'json')
with open('setting.ini', "w") as c_f:
config.write(c_f)
2、加密相关的hashlib模块
# 1、使用场景
# 1)加密需要保护的数据:如登录密码
# 2)比较文件的一致性 # 2、hashlib模块标准使用流程 # 1)、导入模块
import hashlib
# 2)得到md5(或其他算法)对象
md5 = hashlib.md5()
sha1 = hashlib.sha1()
str = b'1432342afsd'
# 3)将二进制的对象,放入进行更新
md5.update(str)
sha1.update(str)
# 4)进行消化,得到加密结果
print(md5.hexdigest(), sha1.hexdigest()) # 不管算法多么不同,摘要的功能始终不变
# 对于相同的字符串使用同一个算法进行摘要,得到的值总是不变的
# 使用不同算法对相同的字符串进行摘要,得到的值应该不同
# 不管使用什么算法,hashlib的方式永远不变 # sha 算法 随着 算法复杂程度的增加 我摘要的时间成本空间成本都会增加 # 3、加盐 为了对付如下情况:
# 虽然MD5摘要算法,是不可逆的,但是有人用穷举法,
# 将大部分可能的字符组合对应的加密结果放入数据库中。即撞库!
md5 = hashlib.md5(b'salt') # 4、动态加盐,将一些固定的字符串,取其一部分作为盐撒进去!
# import hashlib # 提供摘要算法的模块
md5 = hashlib.md5(bytes('盐',encoding='utf-8')+b'')
# md5 = hashlib.md5()
md5.update(b'')
print(md5.hexdigest()) # 5、可以将要加密的内容分开进行update,这跟一次update结果一样,
# 适合文件一致性比较,文件内容很多,可以分成好多次update,但是结果是相同的
with open('1_复习昨天内容.py', mode='rb') as f:
for line in f.readlines():
md5.update(bytes(line))
print(md5.hexdigest())
# 文件的一致性校验 不用加盐 # 6、典型应用,用户注册和登录
account = input('请输入登录账号:》》》').strip()
pwd = input('请输入登录密码:》》》').strip()
md5 = hashlib.md5(b'sl'+bytes(account[2:],encoding='utf-8'))
md5.update(bytes(pwd, encoding='utf-8'))
md5_pwd = md5.hexdigest()
#注册部分
# with open('userinfo',mode='w', encoding='utf-8') as f:
# f.write('%s|%s'%(account, md5_pwd))
# 登录部分
with open('userinfo', encoding='utf-8') as f:
for line in f.readlines():
name, pwd_md5 = line.split('|')
if account == name and pwd_md5 == md5_pwd:
print('登录成功!')
else:
print('登录失败!')
3、日志相关的logging模块
0) 标准配置
import logging
from conf.my_log_settings import * logger = logging.getLogger()
logger.setLevel(logging.DEBUG) if not logger.handlers: fh = logging.FileHandler(filename=log_file, mode='a', encoding='utf-8')
sh = logging.StreamHandler() formatter = logging.Formatter(fmt='%(asctime)s / %(name)s / %(levelname)s /line_no:[%(lineno)d] / %(message)s',
datefmt='%Y-%m-%d %X') fh.setFormatter(formatter)
sh.setFormatter(formatter) logger.addHandler(fh)
logger.addHandler(sh)
1)初步配置
import logging # 默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,
# 这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),
# 默认的日志格式为日志级别:Logger名称:用户输出消息。 # 1) 基本配置 缺点:只能在文件中查看,无法打印到屏幕上 # 创建一个handler,用于写入日志文件
file_handler = logging.FileHandler(filename='x.log', mode='a', encoding='utf-8')
# logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
# datefmt='%Y-%m-%d %H:%M:%S %p',
# handlers=[file_handler,],
# level=logging.DEBUG
# ) # 2)高级配置 使用logger对象
logger = logging.getLogger()
# 再创建一个handler,用于输出到控制台
stream_handler = logging.StreamHandler() formatter_1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
formatter_2 = logging.Formatter('%(asctime)s / %(name)s / %(levelname)s /[line_No]%(lineno)d / %(message)s') file_handler.setFormatter(formatter_1)
stream_handler.setFormatter(formatter_2) logger.addHandler(file_handler) #logger对象可以添加多个fh和ch对象
logger.addHandler(stream_handler) logging.debug("this is debug message")
logging.info("this is info message")
logging.warning("this is warning message")
logging.error("this is error(错误) message")
logging.critical("this is critical message") # logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,
# Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:
# logger.setLevel(logging.Debug)设置级别,当然,也可以通过 fh.setLevel(logging.Debug)单对文件流设置某个级别。
2)配制参数详解
logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有: filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。 format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “-- ::,”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息
3)分割日志存储
import time,logging
from logging import handlers # 日志切割,当日志达到一定条数后,写入新的日志中取,名字在原日志后加时间:hongsun.log.2019-12-18_22-08-23 s_handler = logging.StreamHandler()
r_f_handler = handlers.RotatingFileHandler('funyou.log', maxBytes=1024, backupCount=25, encoding='utf-8')
t_r_f_handler = handlers.TimedRotatingFileHandler(filename='hongsun.log', when='s', interval=25, encoding='utf-8')
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[t_r_f_handler, s_handler, r_f_handler],
level=logging.ERROR
) for i in range(1, 100):
time.sleep(1)
logging.error('KeyboardInterrupt error %s'%str(i))
Python进阶-XVV hashlib模块、configparse模块、logging模块的更多相关文章
- Python进阶----UDP协议使用socket通信,socketserver模块实现并发
Python进阶----UDP协议使用socket通信,socketserver模块实现并发 一丶基于UDP协议的socket 实现UDP协议传输数据 代码如下:
- python全栈开发day22-常用模块二(hashlib、configparse、logging)
一.昨日内容回顾 1.钻石继承 #新式类,本身或父类显示继承object #找名字的时候是广度优先顺序 #有mro方法,super方法, # super并不是单纯的找父类,和mro顺序是完全对应的 # ...
- python之hashlib、configparser、logging模块
hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数 ...
- 模块---hashlib、configparse、logging
一.hashlib模块 hashlib模块介绍:hashlib这个模块提供了摘要算法,例如 MD5.hsa1 摘要算法又称为哈希算法,它是通过一个函数,把任意长度的数据转换为一个长度固定的数据串,这个 ...
- python hashlib、configparse、logging
一.hashlib 1.Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 2.摘要算法 通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目 ...
- collections、random、hashlib、configparser、logging模块
collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...
- Python模块:日志输出—logging模块
1. logging介绍 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用.这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/ ...
- python基础——14(shelve/shutil/random/logging模块/标准流)
一.标准流 1.1.标准输入流 res = sys.stdin.read(3) 可以设置读取的字节数 print(res) res = sys.stdin.readline() print(res) ...
- python 之 软件开发目录规范 、logging模块
6.4 软件开发目录规范 软件(例如:ATM)目录应该包含: 文件名 存放 备注 bin start.py,用于起动程序 core src.py,程序核心功能代码 conf settings. ...
随机推荐
- flask之web网关、三件套、配置、路由(参数、转化器及自定义转化器)、cbv、模板语言、session
目录 1.wsgiref.py 2.werzeug.py 3.三件套 4.配置文件 5.路由本质 6.cbv.py 7.路由转化器 8.自定义转化器 9.模板语言 10.session原理 11.te ...
- jq Sortable的使用
本文仅做翻译记录查看,GitHub原项目地址: https://github.com/RubaXa/Sortable/ ,建议将Sortable.js下载到本地,GitHub上的例子在复制到本地运行, ...
- 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(2) - 单元测试
上一章中我们完成了一个简单的登录功能, 这一章主要演示如何对Stylet工程中的ViewModel进行单元测试. 回忆一下我们的登录逻辑,主要有以下4点: 当"用户名"或" ...
- 第04组 Beta冲刺(2/5)
队名:new game 组长博客 作业博客 组员情况 鲍子涵(队长) 过去两天完成了哪些任务 验收游戏素材 学习Unity 2D Animation系统 基本做完了人物的各个动画 接下来的计划 冲击E ...
- iOS:从头捋一遍VC的生命周期
一.介绍 UIViewController是iOS开发中的核心控件,没有它那基本上任何功能都无法实现,虽然系统已经做了所有控件的生命维护,但是,了解它的生命周期是如何管理还是非常有必要的.网上有很多教 ...
- 程序员,你还不会合理选择Filter、Interceptor、Aspect?
小伙伴们应该听说过过滤器.拦截器.切面,印象上都能够起到截断拦截的作用,在做一些业务需求时,不知道如何选择,今天老顾就来介绍一下他们之间的区别. 过滤器可以拦截到方法的请求和响应 (ServletRe ...
- 详解JAVA8函数式接口{全}
1: 函数式接口 1.1 概念 1.2 格式 1.3@FunctionalInterface注解 1.4 调用自定义函数接口 2:函数式编程 2.1:lambda的延迟执行 2.2 使用Lambda作 ...
- 利用zabbix监控ogg进程(Linux平台下)
前段时间生产的一个数据库的ogg进程挂了快半个月才被发现,已经起不来了,只有重新初始化再同步.因此很有必要监控下ogg的进程,这里给大家介绍如何使用zabbix监控oracle的ogg的进程.思路就是 ...
- GO的执行原理以及GO命令
Go的执行原理以及Go的命令 一.Go的源码文件 Go 的源码文件分类: 如上图,分为三类: 1.命令源码文件: 声明自己属于 main 代码包.包含无参数声明和结果声明的 main 函数. 命令源码 ...
- SpringCloud的入门学习之Eureka(Eureka的单节点)
SpringCloud--->Spring生态体系的微服务架构:https://spring.io/ 官网贴图,如下所示,介绍了微服务的架构体系(话说,英语好读官网,可能很爽吧,没体验过). 1 ...