python学习Day28--模块划分+hashlib模块+configparse模块+logging模块+异常处理
【知识点】
常用模块一:
collection模块(★★★)
时间模块(★★★★)
random模块(★★★★★)
os模块(★★★★★)
sys模块 sys.path sys.modules sys.argv
序列化模块 json/pickle (★★★★★)
re模块(★★★★★)
常用模块二:
hashlib模块 (★★★★★)
configaparse模块 (★)处理配置文件的模块
logging模块 (★★★★★)
1、hashlib模块
能够把一个 字符串 数据类型的变量转换成一个 定长的 密文的 字符串,字符串里的每一个字符都是一个十六进制数字
(1)md5算法:得到一个32位的字符串,每一个字符都是一个十六进制
1 import hashlib 2 3 s='alex3714' 4 md5_obj=hashlib.md5() 5 md5_obj.update(s.encode('utf-8')) 6 res=md5_obj.hexdigest() 7 print(res,len(res),type(res)) 8 # aee949757a2e698417463d47acac93df 32 <class 'str'>
优点:效率快,算法相对简单一些,普及广
① md5——加盐(加强安全性)
1 import hashlib 2 3 s='alex3714' 4 md5_obj=hashlib.md5('任意的字符作为加盐'.encode('utf-8')) 5 md5_obj.update(s.encode('utf-8')) 6 res=md5_obj.hexdigest() 7 print(res,len(res),type(res)) 8 # 889df903fec61e567bf4367f910a94df 32 <class 'str'>
② md5——动态加盐
1 # md5——动态加盐 2 import hashlib 3 4 username=input('请输入用户名:') 5 passwd=input('请输入密码:') 6 md5_obj=hashlib.md5(username.encode('utf-8')) 7 md5_obj.update(passwd.encode('utf-8')) 8 print(md5_obj.hexdigest()) #38cd69698411cb1de19240d88cc66a51
(2)sha1算法:得到40位的字符串,每一个字符都是一个十六进制(也可以加盐)
1 import hashlib 2 3 s='alex3714' 4 md5_obj=hashlib.sha1() 5 md5_obj.update(s.encode('utf-8')) 6 res=md5_obj.hexdigest() 7 print(res,len(res),type(res)) 8 # 8a003668a9c990f15148f9e4046e1410781533b6 40 <class 'str'>
优点:安全性高 缺点:算法相对复杂,计算速度慢
(3)文件的一致性校验
1 # 文件的一致性检验 2 import hashlib 3 4 # md5_obj=hashlib.md5() 5 # with open ('5.序列化模块_shelve.py','rb') as f: 6 # md5_obj.update(f.read()) 7 # ret1=md5_obj.hexdigest() 8 # 9 # md5_obj=hashlib.md5() 10 # with open ('5.序列化模块_shelve.py','rb') as f: 11 # md5_obj.update(f.read()) 12 # ret2=md5_obj.hexdigest() 13 # 14 # print(ret1,ret2) 15 16 # 如果这个文件特别大,内存装不下(大文件的一致性校验) 17 # 按字节读 18 md5_obj=hashlib.md5() 19 md5_obj.update('hello,alex,sb'.encode('utf-8')) 20 print(md5_obj.hexdigest()) # 6557c9e1d6fc95bf2b12e36c09e13c46 21 22 md5_obj=hashlib.md5() 23 md5_obj.update('hello,'.encode('utf-8')) # 注意逗号 24 md5_obj.update('alex,'.encode('utf-8')) # 注意逗号 25 md5_obj.update('sb'.encode('utf-8')) 26 print(md5_obj.hexdigest()) #6557c9e1d6fc95bf2b12e36c09e13c46
2、configaparser模块
1 import configparser 2 3 config = configparser.ConfigParser() 4 5 config["DEFAULT"] = {'ServerAliveInterval': '45', 6 'Compression': 'yes', 7 'CompressionLevel': '9', 8 'ForwardX11':'yes' 9 } 10 11 config['bitbucket.org'] = {'User':'hg'} 12 13 config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'} 14 15 with open('example.ini', 'w') as f: 16 config.write(f)
生成的文件如下:
其他操作:
1 import configparser 2 3 config = configparser.ConfigParser() 4 # print(config.sections()) # [] 5 config.read('example.ini') 6 # print(config.sections()) # ['bitbucket.org', 'topsecret.server.com'] 7 # print('bytebong.com' in config) # False 8 # print('bitbucket.org' in config) # True 9 # print(config['bitbucket.org']["user"]) # hg 10 # print(config['DEFAULT']['Compression']) #yes 11 # print(config['topsecret.server.com']['ForwardX11']) #no 12 # print(config['bitbucket.org']) #<Section: bitbucket.org> 13 # for key in config['bitbucket.org']: # 注意,有default会默认default的键 14 # print(key) 15 # print(config.options('bitbucket.org')) # 同for循环,找到'bitbucket.org'下所有键 16 # print(config.items('bitbucket.org')) #找到'bitbucket.org'下所有键值对 17 # print(config.get('bitbucket.org','compression')) # yes get方法Section下的key对应的value
3、logging模块
(1)功能:
① 日志格式的规范
② 操作的简化
③ 日志的分级管理
(2)logging不能帮你做的事情
① 自动生成你要打印的内容,需要程序员吧在开发的时候定义好:在哪些地方打印,打印什么内容,内容的级别。
(3)logging模块的使用:
① 普通配置型:简单的 可定制化差
② 对象配置型:复杂的 可定制化强
(4)认识日志的分级
1 # 认识logging的分级 2 import logging 3 4 logging.basicConfig(level=logging.DEBUG) # 加入这个下面的debug,info就会显示 5 logging.debug('debug message') # 调试模式 6 logging.info('info message') # 基础信息模块 7 logging.warning('warning message') # 警告 8 logging.error('error message') # 错误 9 logging.critical('critical message') # 严重错误
(5)日志的参数使用
1 # 参数配置 2 import logging 3 4 logging.basicConfig(level=logging.DEBUG, 5 format='%s(asctime)s %(filname)s[line:%(lineno)d] %(levelnames) %(message)s', 6 datefmt='%a,%d %b %Y %H:%M:%S', 7 filename='test.log') 8 logging.debug('debug message') # 调试模式 9 logging.info('info message') # 基础信息模块 10 logging.warning('warning message') # 警告 11 logging.error('error message') # 错误 12 logging.critical('critical message') # 严重错误
(6)logging进阶设置(既可以在屏幕显示,也可以在文件里显示)
1 #*****第一步******* 2 # 创建一个logger对象 3 # 创建一个文件管理操作符 4 # 创建一个屏幕管理操作符 5 # 创建一个日志输出格式 6 7 #*****第二步******* 8 # 文件管理操作符 绑定一个 格式 9 # 屏幕管理操作符 绑定一个 格式 10 11 #*****第三步******* 12 # 将logger对象 绑定 文件管理操作符 13 # 将logger对象 绑定 屏幕管理操作符 14 15 # 第一步 16 import logging 17 18 # 创建一个logger对象 19 logger=logging.getLogger() 20 # 创建一个文件管理操作符 21 fh=logging.FileHandler('logger.log1',encoding='utf-8') 22 # 创建一个屏幕管理操作符 23 sh=logging.StreamHandler() 24 # 创建一个日志输出格式 25 format1=logging.Formatter('%s(asctime)s - %(name)s - %(levelname)s - %(message)s') 26 27 # 第二步 28 # 文件管理操作符 绑定一个 格式 29 fh.setFormatter(format1) 30 logger.setLevel(logging.DEBUG) 31 # 屏幕管理操作符 绑定一个 格式 32 sh.setFormatter(format1) 33 34 # 第三步 35 # 将logger对象 绑定 文件管理操作符 36 logger.addHandler(fh) 37 # 将logger对象 绑定 屏幕管理操作符 38 logger.addHandler(sh) 39 40 logger.debug('debug message') # 调试模式 41 logger.info('info message') # 基础信息模块 42 logger.warning('warning message') # 警告 43 logger.error('error message') # 错误 44 logger.critical('critical message') # 严重错误
4、异常处理
# 什么是异常?异常和错误的区别?
① Error 错误 比较明显的错误 在编译代码阶段就能检测出来
② Iteration 异常 在执行代码的过程中引发的异常
# 异常之后发生的效果:一旦在程序中发生异常,程序就不再继续执行了
# 如何看报错信息?
Traceback——错误的追踪信息; 错误类(有限)——IndexError等;错误提示。
(1)万能异常
1 # 万能异常 2 try: 3 name 4 dic={} 5 dic['key'] 6 except Exception as e: # e——错误对象 7 print(type(e),e,e.__traceback__.tb_lineno)
(2)万能异常与其他分支合作:万能异常要放在所有except的最后
1 # 万能异常和其他分支合作:万能异常要放在所有except的最后 2 try: 3 name 4 dic={} 5 dic['key'] 6 7 except NameError:pass 8 except IndexError:pass 9 except Exception as e: # e——错误对象 10 print(type(e),e,e.__traceback__.tb_lineno)
(3)其他机制
元组写法:
1 try: 2 name 3 dic={} 4 dic['key'] 5 6 except (NameError,IndexError): # 写法一 7 print('error') 8 9 except (NameError,IndexError) as e: # 写法二 10 print(type(e),e,e.__traceback__.tb_lineno)
else与finally:
1 try: 2 pass 3 except NameError: 4 print('name error') 5 else: # try中代码正常执行,没有异常的时候会执行else中的代码 6 print('执行了else了') 7 finally: # 无论如何都会执行(关闭文件) 8 print('执行finally了')
raise主动抛异常:
1 # 主动抛异常 2 try: 3 num=int(input('>>>')) 4 except Exception: 5 print('在出现了异常之后做点什么,再让它抛异常') 6 raise NameError # 主动抛出一个异常
自定义异常:
1 # 自定义异常 2 class FxbError(Exception): # 继承Exception 3 def __init__(self,msg): 4 self.msg=msg 5 6 raise FxbError('这是一个XXX错误,有xxx问题')
(4)断言 assert
1 # 断言 2 assert 1==1 # assert 布尔值 3 # True就往下执行,False就报错
5、collections模块
数据类型的拓展模块
# 什么是队列?先进先出
1 # deque 双端队列 2 from collections import deque 3 # 最先放进去的在中间 4 dq=deque() 5 dq.append(2) 6 dq.append(5) 7 dq.appendleft('a') 8 dq.appendleft('b') 9 print(dq) # deque(['b', 'a', 2, 5]) 10 print(dq.pop()) # 5 # pop返回右端的 11 print(dq) # deque(['b', 'a', 2]) 12 print(dq.popleft()) # b 13 dq.insert(0,'111') 14 print(dq) # deque(['111', 'a', 2])
【总结】:
在insert remove的时候,deque否认平均效率要高于列表
列表根据索引查看某个的值的要高于deque
append和pop对于列表的效率是没有影响的
时间:2020-02-24 14:21:18