python进阶(8):常用模块2+异常处理
前段时间讲了很多的模块应为当时面向对象没有讲有几个没有说今天补上,再说一个异常处理。
本篇导航:
一、hashlib模块
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串
- import hashlib
- md5 = hashlib.md5()
- md5.update('how to use md5 in python hashlib?'.'utf-8')
- print(md5.hexdigest())
- 计算结果如下:
- d26a53750bc40b38b65a520292f69306
md5
如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:
- md5 = hashlib.md5()
- md5.update('how to use md5 in '.'utf-8')
- md5.update('python hashlib?'.'utf-8')
- print(md5.hexdigest())
md5
MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:
- import hashlib
- sha1 = hashlib.sha1()
- sha1.update('how to use sha1 in python hashlib?'.'utf-8')
- print sha1.hexdigest()
sha1
SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。
摘要算法的应用:
任何允许用户登录的网站都会存储用户登录的用户名和口令。会将用户名和口令存在数据库中。如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5
- import hashlib
- user = 'lln'
- pwd = ''
- md5_obj = hashlib.md5()
- md5_obj.update(pwd.encode('utf-8'))
- print(md5_obj.hexdigest())
应用
因为摘要函数是一个单向函数,无法通过摘要反破译出明文,那么很多的破译工具是依据什么破译的呢?很多用户喜欢用123456,888888,password这些简单的口令,于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表,用你的摘要一一匹配俗称撞库。
由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:
- import hashlib
- user = 'lln'
- pwd = ''
- md5_obj = hashlib.md5(user.encode('utf-8')) #加盐
- md5_obj.update(pwd.encode('utf-8'))
- print(md5_obj.hexdigest())
加盐
摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。
二、configparser模块
该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。
1、创建配置文件
- [DEFAULT]
- ServerAliveInterval = 45
- Compression = yes
- CompressionLevel = 9
- ForwardX11 = yes
- [bitbucket.org]
- User = hg
- [topsecret.server.com]
- Port = 50022
- ForwardX11 = no
常见文件
- import configparser
- config = configparser.ConfigParser()
- 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)
文件创建
2、查找文件
- import configparser
- config = configparser.ConfigParser()
- #---------------------------查找文件内容,基于字典的形式
- print(config.sections()) # []
- 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['bitbucket.org']["user"]) # hg
- print(config['DEFAULT']['Compression']) #yes
- print(config['topsecret.server.com']['ForwardX11']) #no
- print(config['bitbucket.org']) #<Section: bitbucket.org>
- for key in config['bitbucket.org']: # 注意,有default会默认default的键
- print(key)
- print(config.options('bitbucket.org')) # 同for循环,找到'bitbucket.org'下所有键
- print(config.items('bitbucket.org')) #找到'bitbucket.org'下所有键值对
- print(config.get('bitbucket.org','compression')) # yes get方法Section下的key对应的value
文件查找
3、增删改操作
- import configparser
- config = configparser.ConfigParser()
- config.read('example.ini')
- config.add_section('yuan')
- config.remove_section('bitbucket.org')
- config.remove_option('topsecret.server.com',"forwardx11")
- config.set('topsecret.server.com','k1','')
- config.set('yuan','k2','')
- config.write(open('new2.ini', "w"))
增删改
三、logging模块
loggong模块负责记录日志,也可以用来查错,在程序不同位置控制显示台输出
- import logging
- logging.debug('debug message')
- logging.info('info message')
- logging.warning('warning message')
- logging.error('error message')
- logging.critical('critical message')
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为(日志级别:Logger名称:用户输出消息)
配置日志级别,日志格式,输出位置:
- import logging
- logging.basicConfig(
- level=logging.DEBUG,
- format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
- datefmt='%a, %d %b %Y %H:%M:%S',
- filename='/tmp/test.log',
- filemode='w'
- )
- logging.debug('debug message')
- logging.info('info message')
- logging.warning('warning message')
- logging.error('error message')
- logging.critical('critical message')
属性和配置参数
- 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 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
- %(thread)d 线程ID。可能没有
- %(threadName)s 线程名。可能没有
- %(process)d 进程ID。可能没有
- %(message)s用户输出的消息
logger对象配置
- import logging
- logger = logging.getLogger()
- # 创建一个handler,用于写入日志文件
- file_handler= logging.FileHandler('test.log')
- # 再创建一个handler,用于输出到控制台
- stream_handler= logging.StreamHandler()
- formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
- file_handler.setFormatter(formatter)
- stream_handler.setFormatter(formatter)
- logger.addHandler(file_handler) #logger对象可以添加多个file_handler和stream_handler对象
- logger.addHandler(stream_handler)
- 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')
- import logging
- def my_logger(filename,file=True,stream = True):
- logger = logging.getLogger()
- formatter = logging.Formatter(fmt='%(name)s %(asctime)s [%(lineno)d] -- %(message)s',
- datefmt='%d/%m/%y %H:%M:%S')
- logger.setLevel(logging.DEBUG) #指定日志打印的等级
- if file:
- file_handler = logging.FileHandler(filename,encoding='utf-8')
- file_handler.setFormatter(formatter) # 文件流 文件操作符
- logger.addHandler(file_handler)
- if stream:
- stream_handler = logging.StreamHandler()
- stream_handler.setFormatter(formatter) #屏幕流 屏幕操作符
- logger.addHandler(stream_handler)
- return logger
- logger = my_logger('logging')
- logger.warning("出错了")
- logger.debug("debug")
封装函数使用
四、异常处理
1、异常种类
- x #NameError: name 'x' is not defined
- int('abc') #ValueError: invalid literal for int() with base 10: 'abc'
- l = []
- l[10000] #IndexError: list index out of range
- class Foo:pass
- Foo.x #AttributeError: type object 'Foo' has no attribute 'x'
- 1/0 #ZeroDivisionError: division by zero
- dic = {'k':'v'}
- dic['k2'] #KeyError: 'k2'
- l = [1]
- ll = iter(l)
- print(next(ll))
- print(next(ll)) #StopIteration
之前我们常遇到的异常
- x #NameError: name 'x' is not defined
- int('abc') #ValueError: invalid literal for int() with base 10: 'abc'
- l = []
- l[10000] #IndexError: list index out of range
- class Foo:pass
- Foo.x #AttributeError: type object 'Foo' has no attribute 'x'
- 1/0 #ZeroDivisionError: division by zero
- dic = {'k':'v'}
- dic['k2'] #KeyError: 'k2'
- l = [1]
- ll = iter(l)
- print(next(ll))
- print(next(ll)) #StopIteration
常见异常
- ArithmeticError
- AssertionError
- AttributeError
- BaseException
- BufferError
- BytesWarning
- DeprecationWarning
- EnvironmentError
- EOFError
- Exception
- FloatingPointError
- FutureWarning
- GeneratorExit
- ImportError
- ImportWarning
- IndentationError
- IndexError
- IOError
- KeyboardInterrupt
- KeyError
- LookupError
- MemoryError
- NameError
- NotImplementedError
- OSError
- OverflowError
- PendingDeprecationWarning
- ReferenceError
- RuntimeError
- RuntimeWarning
- StandardError
- StopIteration
- SyntaxError
- SyntaxWarning
- SystemError
- SystemExit
- TabError
- TypeError
- UnboundLocalError
- UnicodeDecodeError
- UnicodeEncodeError
- UnicodeError
- UnicodeTranslateError
- UnicodeWarning
- UserWarning
- ValueError
- Warning
- ZeroDivisionError
更多异常
2、异常处理
1)何为异常
异常发生之后
异常之后的代码就不执行了也就是我们所说的bug
2)何为异常处理
python解释器检测到错误,触发异常(也允许程序员自己抛出异常)
程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)
如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理
3)为什么要进行异常处理
python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件。
所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性
3、异常处理
1)基本处理
- try:
- 被检测的代码块
- except 异常类型:
- try中一旦检测到异常,就执行这个位置的逻辑
基本语法
- try:
- int(num)
- except ValueError:
- print('请输入一个数字')
简单实例
异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
- # 未捕获到异常,程序直接报错
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print e
2)多分支
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print(e)
- except KeyError as e:
- print(e)
- except ValueError as e:
- print(e)
3)万能异常
万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任意异常
- s1 = 'hello'
- try:
- int(s1)
- except Exception as e:
- print(e)
万能异常
不推荐使用因为捕捉到异常后不好查找,所有异常用同样方式处理也不友好
4)异常的其他机构
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print(e)
- except KeyError as e:
- print(e)
- except ValueError as e:
- print(e)
- #except Exception as e:
- # print(e)
- else:
- print('try内代码块没有异常则执行我')
- finally:
- print('无论异常与否,都会执行该模块,通常是进行清理工作')
5)主动抛异常
- try:
- raise TypeError('类型错误')
- except Exception as e:
- print(e)
6)自定义异常
- class EvaException(BaseException):
- def __init__(self,msg):
- self.msg=msg
- try:
- raise EvaException('类型错误')
- except EvaException as e:
- print(e)
7)断言
- # assert 条件
- assert 1 == 1
- assert 1 == 2 #一个会抛出异常的判断
- #基本很难会用到,只有一些特定场合
4、什么时候用异常处理
当在这一块代码块这里可能出现的问题千奇百怪,去解决你想不到的具体的错误的时候
你能想到有异常,并且可能出现在这一块代码的异常有很多种,不能一一枚举
禁止在大段代码外面套异常处理
如果仅仅是预防以及在你能想到的情况范围内做限制可以使用if
python进阶(8):常用模块2+异常处理的更多相关文章
- Python进阶-XI 常用模块之一:collections、time、random、os、sys
简要介绍一下各种集合: 列表.元组.字典.集合(含frozenset).字符串.堆栈(如手枪弹夹:先进后出).队列(如马克沁机枪的弹夹:先进先出) 1.collections 1)queue 队列介绍 ...
- python进阶06 常用问题库(2)datetime模块 base64
python进阶06 常用问题库(2)datetime模块 base64 一.datetime模块(时间) 1.datetime.time() t=datetime.time(20,43,30,1) ...
- python进阶05 常用问题库(1)json os os.path模块
python进阶05 常用问题库(1)json os os.path模块 一.json模块(数据交互) web开发和爬虫开发都离不开数据交互,web开发是做网站后台的,要跟网站前端进行数据交互 1.什 ...
- python笔记之常用模块用法分析
python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...
- 十八. Python基础(18)常用模块
十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...
- python基础31[常用模块介绍]
python基础31[常用模块介绍] python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...
- Python进阶(九)----json模块, pickle模块, os模块,sys模块,hashlib模块
Python进阶----json模块, pickle模块, os模块,sys模块,hashlib模块 一丶序列化模块 什么是序列化: 将一种数据结构,转换成一个特殊的序列(特殊字符串,用于网络传输 ...
- Python 五个常用模块资料 os sys time re built-in
1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称('posix', 'nt', ' ...
- Python基础之--常用模块
Python 模块 为了实现对程序特定功能的调用和存储,人们将代码封装起来,可以供其他程序调用,可以称之为模块. 如:os 是系统相关的模块:file是文件操作相关的模块:sys是访问python解释 ...
- Python自动化之常用模块
1 time和datetime模块 #_*_coding:utf-8_*_ __author__ = 'Alex Li' import time # print(time.clock()) #返回处理 ...
随机推荐
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明
php有一款插件叫做imagemagick,功能很强大,提供了图片的很多操作,图片剪切.压缩.合并.插入文本.背景色透明等.并且有api方法调用和命令行操作两种方式,如果只是简单处理的话建议api方法 ...
- iOS获取ipa素材、提取ipa包资源文件
当我们看到一款优秀的App时,我们可能对它的一些素材比较感兴趣,或者我们也想仿写一款类似app,那么怎么能获取到它的素材资源文件呢? 下面我以ofo举例: 1.打开iTunes,搜索ofo关键字,选择 ...
- tp框架-----Model模型层
1.Model模型层是用来做什么的呢? 主要是用来做操作数据库访问的.也就说明TP框架自带了一种访问数据库的方式,使用的是Model模型. 2.Model模型怎样使用呢? 要使用Model模型层访问数 ...
- 水题 第三站 HDU Largest prime factor
先写一遍思路,跟素数表很类似吧. 1)从小到大遍历数据范围内的所有数.把包含质因子的数的位置都设成跟质因子的位置相同. 2)同一个数的位置可能被多次复写.但是由于是从小到大遍历,这就保证了最后一次写入 ...
- EventBus 事件总线之我的理解
用例:假设公司发布了一个公告 需要通过短信 和 邮件分别2种方式 通知员工 1:首先我们建立领域模型 /// <summary> /// 领域核心基类 /// </summary&g ...
- Broker模块划分
本篇在上一篇<消息中间件架构讨论>的基础上分析Broker的模块划分. 上图是之前讨论确定的系统架构(后续内容会按照这个架构来叙述),几点基础: Broker采用主从结构 Broker负责 ...
- 玩玩微信公众号Java版之一:配置微信公众平台服务器信息
在进行微信公众平台开发前,前先做好准备工作,好了以后,我们可以开始啦! 第一.准备好服务端接口 定义一个http服务接口,主要分为如下几步: 1.创建一个servlet类,用来接收请求: ...
- 聊一聊FE面试那些事
聊一聊FE面试那些事 最近公司由于业务的扩展.技术的延伸需要招一批有能力的小伙伴加入,而我有幸担任"技术面试官"的角色前前后后面试了不下50多位候选人,如同见证了50多位前端开发者 ...
- Apache FtpServer 实现文件的上传和下载
1 下载需要的jar包 Ftp服务器实现文件的上传和下载,主要依赖jar包为: 2 搭建ftp服务器 参考Windows 上搭建Apache FtpServer,搭建ftp服务器 3 主要代码 在ec ...
- 【Django】url传递参数
1. url传递参数的特殊字符 在压缩后,可能出现 + - = 空格 这类特殊字符,需要在传递前进行url编码 urllib.enquote(string) 获取参数后 urllib.un ...