zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    OC学习笔记
    feed43+ifttt
    让Hyper-V和VMware虚拟机软件共存
    ios问题集
    vs2012问题集
    第二个win8应用制作笔记
    隐私策略
    《龙泉青瓷》隐私策略
    win8开发-Xaml学习笔记四
    梦想成为“老板”的第N天
  • 原文地址:https://www.cnblogs.com/fengxb1213/p/12342722.html
Copyright © 2011-2022 走看看