一、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

  

												

最新文章

  1. C#实现MS-Office文档转Pdf(Word、Execel、PowerPoint、Visio、Project)
  2. iOS开发小技巧--iOS8之后的cell自动计算高度
  3. Android Studio升级后,开启时遇到tools.jar seems to be not in Android Studio错误?
  4. java 16 -11 ArrayList存储自定义对象并增强for遍历
  5. idea给web项目添加tomcat
  6. 计算机中如何表示数字-07IEEE754浮点数标准
  7. CentOS安装Node.js简单教程
  8. java JdbcTemplate源码
  9. 【开源java游戏框架libgdx专题】-07-文件处理
  10. AndroidUI--SlidingMenu使用例子
  11. mysql-笔记-datetime
  12. VMware 常见问题及解决办法
  13. ionic3 Modal组件
  14. SQL Server扩展事件的使用ring_buffer target时“丢失”事件的原因分析以及ring_buffer target潜在的问题
  15. MySQL 性能调优之SQL
  16. LeetCode 669 Trim a Binary Search Tree 解题报告
  17. variable &#39;QJsonArray array&#39; has initializer but incomplete type
  18. cocos2d-x绑lua的开发环境
  19. SPARK:作业基本运行原理
  20. OpenGL ES 系列教程

热门文章

  1. mysql自定义函数收集
  2. LFS(Linux From Scratch)学习
  3. Judy Array API介绍
  4. 16进制string转成int
  5. LNMP 网站搭建
  6. HTTP 500.21 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
  7. js正则表达式汇集
  8. modelsim读写TXT文件
  9. _variant_t与其他数据类型的转换
  10. hbase使用MapReduce操作3(实现将 fruit 表中的一部分数据,通过 MR 迁入到 fruit_mr 表中)