Day 29 _模块二 -hashlib_configparse_logging
一、hashlib
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:
import hashlib
md5_obj =hashlib.md5() #md5算法的对象
res = md5_obj.hexdigest() #获取摘要之后的结果
print(res,type(res))
# 输出结果:
# d41d8cd98f00b204e9800998ecf8427e <class 'str'>
user =input('user>>>')
passwd = input('password>>>')
md5_obj=hashlib.md5()
md5_obj.update(passwd.encode('utf-8'))
passwd =md5.obj.hexdigest()
if user =='alex' and passwd =='aee949757a2e698417463d47acac93df':
print('登录成功!')
md5_obj =hashlib.sha1()#实例化
#md5算法的对象
md5_obj.update(b'alex3714')#使用sha1 摘要算法对‘alex3714进行摘要’
res = md5_obj.hexdigest()#获取摘要后的结果
print(res,type(res))
# 输出结果为:8a003668a9c990f15148f9e4046e1410781533b6 <class 'str'>
#相同的字符串使用相同的算法, 在任何时候
#等等的结果都是一致的.
一.1 加盐操作
#全世界的md5算法都是一样的. # 全世界的md5算法都是一样的
# 123456 111111
md5_obj = hashlib.md5()
# md5算法的对象
md5_obj.update(b'') # 使用md5摘要算法对'alex3714'进行摘要
res = md5_obj.hexdigest() # 获取摘要之后的结果
print(res,type(res)) #aee949757a2e698417463d47acac93df 32位
# 123456 e10adc3949ba59abbe56e057f20f883e
# 撞库 #加盐
md5_obj = hashlib.md5('盐'.encode('utf-8'))
#md5算法的对象
md5_obj.update(b'alex3714')#使用md5 摘要算法对‘alex3714’进行摘要
res = md5_obj.hexdigest() #获取摘要后的结果
print(res,type(res))
# 打印结果 :0e249b9c16ea1d840ce700587cada978 <class 'str'>
动态加盐
username ='alex'
md5_obj = hashlib.md5(username.encode('utf-8')+'盐'.encode('utf-8'))
md5_obj.update(b'alex3714')
res =md5_obj.hexdigest()
print(res)
# 打印结果 :a106943dd5c1d5caf59bc80c05295ad6
校验文件一致性
#校验文件一致性
with open('userinfo','rb') as f :
md5_obj =hashlib.md5()
md5_obj.update(f.read())
res = md5_obj.hexdigest()
print(res)
#结果:84b2fe284833ac7903a7ac865e6c27a9 with open('userinfo','rb')as f:
md5_obj =hashlib.md5()
for line in f:
md5_obj.update(line) #update 操作可以在hexdigest之前执行多次
#分次对一个长字符串进行摘要
res = md5_obj.hexdigest() #结果是对一个厂字符串摘要的摘要结果.
print(res)
# 输出结果 :84b2fe284833ac7903a7ac865e6c27a9
拼接校验
# md5_obj = hashlib.md5()
# md5_obj.update(b'aaabbb')
# res = md5_obj.hexdigest()
# print(res) #6547436690a26a399603a7096e876a2d
#
# md5_obj = hashlib.md5()
# md5_obj.update(b'aa')
# md5_obj.update(b'abbb')
# res = md5_obj.hexdigest()
# print(res) #6547436690a26a399603a7096e876a2d
二、configparse
该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。
# .py 里面的所有值 都不需要进行转换或者处理 直接当做变量使用
#通用性不高
# 文本格式 key = value
# 都要进行文件处理 _ 通用
# ini
# [北京校区] # section
# 课程 = python,linux # option
# python讲师 = egon,yuanhao,nezha,boss_gold
# linux讲师 = 李导,何首乌
# [上海校区]
# 课程 = go,linux
# python讲师 = egon
# linux讲师 = 李导,何首乌
import configparser
config =configparser.ConfigParser()
#confi 是一个操作配置文件的对象
config['DEFAULT'] ={'ServerAliveInterval': '',
'Compression':'yes',
'CompressionLevel':'',
'ForwardX11':'yes'
}
config['bitbucket.org'] = {'User':'hg'}
config['topsecret.server.com'] ={'Host Port': '',
'ForwardX11':'no'
}
with open('example.ini','w')as configfile:
config.write(configfile)
结果为
configparese的操作方法
import configparser
config = configparser.ConfigParser()
config.read(('example.ini'))
print(config.sections())
# 打印结果 ['bitbucket.org', 'topsecret.server.com'] print('bytebong.com' in config)
#打印结果 False
print('bitbucket.org' in config)
#打印结果 True
print( config[ 'DEFAULT']['Compression']) #获取 setion里 option的值 yes
print(config['topsecret.server.com']['ForwardX11'])#获取 setion里option的值NO print(config['bitbucket.org'])#<Section: bitbucket.org> for key in config['bitbucket.org']:
print(key)
# 注意, 有default 会默认default的键
# user
# serveraliveinterval
# compression
# compressionlevel
# forwardx11 print(config.options('bitbucket.org'))
#打印结果 ['user', 'serveraliveinterval', 'compression', 'compressionlevel', 'forwardx11']
#同for循环,找到‘bitbucket.org'下所有键.
print(config.items('bitbucket.org'))
#找到 ’bitbucket.org'下所有键值对
# [('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')]
print(config.get('bitbucket.org','compression'))
#结果 yes
# get方法section下的key对应的value
增删改查
# 增删改操作
import configparser
config = configparser.ConfigParser()
config.read('example.ini')
config.add_section('yuan')
config.remove_option('topsecret.server.com','forwardx11')
config.set('topsecret.server.com','k1','')
config.set('yuan','k2','')
config.write(open('new2.ini','w'))
三 、logging 操作日志的模块
什么叫日志
#给用户看的
用户的重要行为
登录 涉及隐私
账单 资金
#给开发和运维和测试人员看的
自测 logging.debug(‘一些中间结果’)
测试 1+++++1
运维
#记录
打印在屏幕上
写入文件里
#logging 的优势
格式更加规范
等级更加鲜明 3.1 简单的配置方法
import logging
logging.basicConfig(level=logging.ERROR,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt ='%a , %d %b %Y %H %M : %S',
filename ='test.log',
filemode ='a')
logging.debug('debug message')#调试
logging.info('info message')#信息
logging.warning("warning message")#警告
logging.error('error message') #错误
logging.critical('critical message') #严重错误
结果
Wed, 14 Mar 2018 17:18:17 1.py[line:23] ERROR error message
Wed, 14 Mar 2018 17:18:17 1.py[line:24] CRITICAL critical message
Wed , 14 Mar 2018 17 20 : 22 1.py[line:10] ERROR error message
Wed , 14 Mar 2018 17 20 : 22 1.py[line:11] CRITICAL critical message
Wed , 14 Mar 2018 17 20 : 22 1.py[line:23] ERROR error message
Wed , 14 Mar 2018 17 20 : 22 1.py[line:24] CRITICAL critical message
#使用logger对象的用法
import logging
#首先创造一个logger对象
logger =logging.getLogger()
#创建一个格式.
fmt =logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #创建一个 文件句柄 控制向那个文件中输出什么格式.
fh =logging.FileHandler('test3.log',encoding='utf-8')
fh.setFormatter(fmt)
#创建一个屏幕句柄 控制向屏幕输出 用什么格式
sh =logging.StreamHandler()
sh.setFormatter(fmt) #将logger对象和文件句柄,屏幕句柄绑在一起.
logger.addHandler(fh)
logger.addHandler(sh)
logger.setLevel(logging.DEBUG)#首先必须要整体对logger进行设置
sh.setLevel(logging.INFO)
fh.setLevel(logging.WARNING)
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')
输出结果
2018-03-14 18:47:13,752 - root - INFO - logger info message
2018-03-14 18:47:13,752 - root - WARNING - logger warning message
2018-03-14 18:47:13,752 - root - ERROR - logger error message
2018-03-14 18:47:13,752 - root - CRITICAL - logger critical message
Day 29 _模块二 -hashlib_configparse_logging的更多相关文章
- day09_雷神_模块二
day09 序列化之json 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊 ...
- NGINX模块(二)
[Nginx标准HTTP模块] 一.HTTP核心模块 指令1:alias 语法:alias file-path|directory-path; 默认值:no 使用字段:location 说明:这个指令 ...
- 稳定排序nlogn之归并排序_一维,二维
稳定排序nlogn之归并排序_一维,二维 稳定排序:排序时间稳定的排序 稳定排序包括:归并排序(nlogn),基数排序[设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排 ...
- python之爬虫_模块
目录 一.requests模块二.Beautifulsoup模块 一.requests模块 1.介绍 Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但 ...
- 常用模块二(hashlib、configparser、logging)
阅读目录 常用模块二 hashlib模块 configparse模块 logging模块 常用模块二 返回顶部 hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SH ...
- Python - 模块(二)
目录 Python - 模块(二) re re下面的方法 logging os Python - 模块(二) re re模块提供了正则表达式的相关操作 主要字符介绍: . 通配符,除了换行符之外的任意 ...
- 模块(二)os hashlib
模块(二)os hashlib 1.序列化模块 1.1 json 将满足条件的数据结构转化成特殊的字符串,并且可以反序列化转回去 # 两对方法 # 1 dumps() loads() ## 多用于网络 ...
- 模块二之序列化模块以及collections模块
模块二之序列化模块以及collections模块 一.序列化模块 json模块 ''' 序列化:将python或其他语言的数据类型转换成字符串类型 json模块: 是一个序列化模块. json: 是一 ...
- node基础(二)_模块以及处理乱码问题
一.前言 本次内容主要包括: 1.node.js中的模块系统 2.解决上篇中服务器响应的汉字乱码问题 二.知识 1.node中的模块 分为三种: 核心模块(node定义的如前面用到的fs,http ...
随机推荐
- 12-ssm中的description The request sent by the client was syntactically incorrect.
此问题一般是在前端的数据传回是封装成对象失败的情况: 1.对象名不一致: 2.对象的数据类型不一致: 特别注意日期类型的: 如果前端是date数据类型的话: 传入的日期有问题 在pojo类中限定 @D ...
- 20172325 2017-2018-2 《Java程序设计》第七周学习总结
20172325 2017-2018-2 <Java程序设计>第七周学习总结 教材学习内容总结 1.创建子类 (1) 子类是父类更具体的版本,但子类的实例化不依赖于父类: (2) 继承有单 ...
- type="image"提交表单
<input type="image" style="cursor:pointer; ">
- form 表单添加 enctype ="multipart/form-data" 属性后后台接收中文乱码
解决办法: new String( request.getParameter("title").getBytes("ISO-8859-1"),"utf ...
- 针对程序员的podcast
身为程序员们,必须要懂得合理的利用琐碎时间来提炼自身,或许上下班途中或骑行或徒步或...时,以下这些Podcasts对你有些许作用: The Hanselminutes podcast by Scot ...
- 【Web】Nginx下载与安装
Nginx介绍 Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗 ...
- JSP 介绍
Servlet进行逻辑处理效率高,但是页面响应效率低,不太方便. 问题: 在学习了Servlet之后,使用Servlet进行页面的展现,代码书写过于麻烦. 极大的影响了开发的效率,那么有没有一种方式可 ...
- IC向管理者角色转换
1. 虽然你认为自己已经想明白怎么干,但还是从怎么干回归到要解决的问题,抛给正确的人(应该对这些问题负责的人),引导他们想出问题的答案. 给别人机会和空间,帮助他们成长: 人们对自己“想”出的方案更有 ...
- Part 6 - Class-Based Views(21-26)
https://github.com/sibtc/django-beginners-guide/tree/v0.6-lw urlpatterns = [ views.PostUpdateView.as ...
- [转载][翻译]Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[2]
Golang作为一个略古怪而新的语言,有自己一套特色和哲学.从其他语言转来的开发者在刚接触到的时候往往大吃苦头,我也不例外.这篇文章很细致地介绍了Golang的一些常见坑点,读完全篇中枪好多次.故将其 ...