今天学习Python中的模块,模块类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个.py文件组成的代码集合就称为模块。
模块分为三种:
自定义模块
第三方模块
内置模块
下面就分别就这三种模块的展开学习:
一、自定义模块
1,定义模块,定义模块的场景有三种:
2,导入模块
下面就根据上面三种场景分别进行导入,导入的方法如下:
导入模块其实就是告诉Python解释器去解释那个py文件,先导入一个py文件,解释器解释该py文件,然后导入一个包,解释器解释该包下的__init__.py文件,
那么我们怎么才能获取导入模块时是根据那个路径作为基准来进行的呢?这里就需要导入内置模块sys的path方法:
如果sys.path路径列表没有你想要的路径,可以通过sys.path.append('路径')添加,具体代码如下:
二、第三方软件
1、下载安装第三方模块
下载安装有两种方式:
注:在源码安装时要依赖gcc编译和Python开发环境的支持,要先执行:
模块安装成功后,通过sys.path找到模块的路径,然后在目录中就可以找到刚刚安装的模块。
2、使用导入模块
下面就举一个例子来示范,如果使用和导入第三方模块:
三、内置模块
1、sys模块——用于提供Python解释器相关操作:
2、os模块——用于提供系统级别的操作
3、json、pickle——python中用于序列化的两个模块
json :用于【字符串】和【python基本数据类型】间进行转换
pickle:用于【python特有类型】和【python基本数据类型】间的转换
Json模块提供了四个功能:dumps、loads、dump、load,下面介绍一下具体用法:
同样pickle也提供了四个功能:dumps、loads、dump、laod
下面总结一下json和pickle的区别:
Json: 更适合跨语言,字符串,只能处理Python的基本数据类型
Pickle:只用于Python做所有类型的序列化,仅适用于Python,上下版本有可能不兼容
4、time模块——时间相关的操作
时间相关的操作,时间有三种表示方式:
时间戳 1970年1月1日之后的秒,即:time.time()
格式化的字符串 2016-06-09 11:25,即:time.strftime('%Y-%m-5d')
结构化时间 元组包含了:年、日、星期等......time.struct_time 即:time.localtime()
下面具体介绍一下time模块的一些方法:
下面是时间格式化的占位符的表示方法:
5、logging——用于简便记录日志且线程安全的模块
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还有错误、警告等信息输出,Python的logging模块就提供了标准的
日志接口,可以通过它存储各种格式的日志。
logging的日志可以分为debug(),info(),warning(),error(),critical() 5个级别
这几个级别的严重性从低到高依次为DEBUG
下面具体介绍一下模块的使用:
上面的例子是将结果输出到屏幕上,如果我想将日志写到文件里,如何操作呢?
上面的例子里发现文件里没有记录时间,下面就修改一下代码加上时间格式:
下面介绍一下logging.basicConfig函数的各个参数:
如果想同时把log打印在屏幕和日志里,就需要在掌握一些复杂的知识:
logger:提供了应用程序可以直接使用的接口;
handler:将(logger创建的)日志记录发送到合适的目的输出;
filter:提供细度设备来决定输出那条日志记录;
formatter:决定日志记录的最终输出格式。
下面就分别介绍一下上面这四种方法在实际工作中的应用:
1、Logger
Logger输出信息之前必须获得一个Logger(如果没有显示的获取则自动创建并使用root Logger)。
这里所说的Logger就是程序的执行用户,默认是root执行,可以指定zabbix、nginx等用户。
logger = logging.getLogger() 返回一个默认的Logger也即root Logger,并应用默认的日志级别WARNING、Handler和Formatter设置
logging.setLevel(level) 指定最低的日志级别,可用日志级别有:logging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR、 logging.CRITICAL.
注意:此处定义为全局的日志级别, 全局日志级别是一个基调,下面局部日志级别只能比全局日志级别高或者相等才能正常输出,不能比全局日志级别低。
2、Handler
Handler对象负责发送相关的信息到指定目的地,有几个常用的Handler方法:
Handler.setLevel(level): 指定日志级别,低于全局日志级别的日志将被忽略
Handler.setFormatter():给这个handler选择一个Formatter
Handler.addFilter(filt)、Handler.remove(filt):新增或删除一个filter对象
可以通过addHandler()方法为Logger添加多个Handler:
下面列举几种定义Handler输出的方法:
3、Formatter
Formatter对象设置日志信息最后的规则、结构和内容,默认时间格式为%Y-%m-%d %H:%M:%S
Formatter参数中用到的字符串的占位符和logging.basicConfig()函数用到的相同。
4、Filter
限制只有满足过滤规则的日志才会输出,比如我们定义了filter=logging.Filter('a,b,c'),并将这个Filter添加给了一个Handler上,则使用该Handler的Logger中只有名字带有a,b,c前缀的Logger才会输出其日志。
上面分别介绍了一下logging模块的高级用法中的Logger、Handler、Formatter和Filter,下面通过一个小例子把几个用法串到一起使用:
今天模块就介绍到这里,后续还有一些常用的模块在陆续补充,请大家持续关注。