本节大纲:
1.模块介绍
2.time&datetime
3.random.
4.os
5.sys
6.shutil
7.json&picle
8.shelve
9.xml处理
10.yaml处理
11.configparser
12.hashlib
13.subprocess
14.logging模块
15.re正则表达式
模块的定义:用一堆代码实现了某个功能的代码集合
类似与函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合,而对于一个复杂的功能来说,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个.py文件组成的代码集合就称为模块
如:os是系统相关的模块,file是文件操作相关的模块
模块分为三种:
自定义模块
内置模块
开源模块(第三方模块)
自定义模块
1.定义模块
情景一
情景二
2.导入模块
在python中,要想使用模块,需要先导入,导入模块有以下几种方式:
如要导入一个名为module的模块
1 import module 2 from module.xx.xx import xx 3 from module.xx.xx import xx as rename 4 from module.xx.xx import * #*号这种导入模式会导入一个模块中的所有项目,这种方法虽然很简单,便利,但是不推荐使用, #因为引入的其他来源的命令,很可能覆盖了已有的定义,存在一定的安全隐患
导入模块其实就是在告诉Python解释器去解释那个py文件
如果导入的是一个py文件,解释器就解释该py文件
如果导入的是一个包,解释器就解释该包下的__init__.py文件
Python中,导入模块时是根据那个路径作为基准来进行的呢?
可通过sys模块中的sys.path来查看
import sys print(sys.path) #['D:\\PycharmProjects\\fullstack\\homework_oneday\\module\\module_file', 'D:\\PycharmProjects\\fullstack', 'C:\\Program Files\\Python35\\python35.zip', 'C:\\Program Files\\Python35\\DLLs', 'C:\\Program Files\\Python35\\lib', 'C:\\Program Files\\Python35', 'C:\\Program Files\\Python35\\lib\\site-packages']
如果sys.path路径列表中没有你想要的路径,可以通过sys.path.append('路径')添加
通过os模块可以获取各种目录
import sys import os pre_path = os.path.abspath('../') sys.path.append(pre_path)
包(package)的概念
我们先设想一下,如果不同的人编写的模块名相同怎么办?为了避免冲突,Python又引进了按目录来组织模块的方法,称为包(package)。
假设,如下图,我的两个time_file.py模块名字重名了,但是这两个模块的功能都不相同,如果这两个模块都在同一级目录中,那么我在其他地方要调用这个time_file.py模块,那么这个时候就会发生冲突,在这里我们就可以通过包来组织模块,避免冲突,
方法是:选择一个顶层包名,引入包以后,只要顶层的包名不与别人冲突,那这个包里面的模块都不会与别人冲突了。
请注意:每个包目录下来都会有一个__init__.py的文件,这个文件必须是存在的,否则,Python就不把这个目录当成普通目录,而不是一个包,__init__.py可以是空文件,也可以有python代码,__init__.py本身就是一个文件,它的模块命就是对应的包名,它一般由于做接口文件
开源模块(第三方模块)
一.下载安装
下载安装的两种方式
1 yum 2 pip 3 apt-get 4 ...
1 下载源码 2 解压源码 3 进入目录 4 编译源码 python setup.py build 5 安装源码 python setup.py install
注:在使用源码安装时,需要使用到gcc编译和Python开发环境,所以,要事先将环境安装上
1 yum install gcc 2 yum install python-devel 3 或 4 apt-get python-dev
安装成功后,模块会自动安装到sys.path中的某个目录中,如:
1 /usr/lib/python3.5/site-packages/
导入模块的方式同自定义模块导入的方式一样
三.模块paramiko(晚上回家补齐)
内置模块
一.time()模块
在python中,通常有以下几种方式来表示时间:
时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,
格式化的时间字符串:
元组(struct_time):struct_time元组共有9个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
1 import time 2 3 print(time.time()) # 返回当前时间的时间戳 1481597763.3750336 4 print(time.localtime()) # 将一个时间戳转换为当前时区 5 # time.struct_time(tm_year=2016, tm_mon=12, tm_mday=13, tm_hour=10, tm_min=57, tm_sec=31, tm_wday=1, tm_yday=348, tm_isdst=0) 6 print(time.gmtime()) # localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。 7 # time.struct_time(tm_year=2016, tm_mon=12, tm_mday=13, tm_hour=3, tm_min=0, tm_sec=47, tm_wday=1, tm_yday=348, tm_isdst=0)
1 print(time.ctime()) # Tue Dec 13 21:29:55 2016 2 3 print(time.gmtime(time.time()-9000)) 4 #返回utc时间的struc时间对象格式 5 #time.struct_time(tm_year=2016, tm_mon=12, tm_mday=13, tm_hour=11, tm_min=2, tm_sec=17, tm_wday=1, tm_yday=348, tm_isdst=0) 6 7 8 9 #日期转换成时间戳 10 time_struct = time.strptime("2016-12-12 18:24:30","%Y-%m-%d %X") 11 print(time_struct) 12 #time.struct_time(tm_year=2016, tm_mon=12, tm_mday=12, tm_hour=18, tm_min=24, tm_sec=30, tm_wday=0, tm_yday=347, tm_isdst=-1) 13 #将日期字符串转换struct时间对象格式 14 15 16 #将struct时间对象转换成时间戳 17 time_struct = time.strptime("2016-12-12 18:24:30","%Y-%m-%d %X") 18 time_one_struct = time.mktime(time_struct) 19 print(time_one_struct) 20 #1481538270.0 21 22 #将时间戳转换为字符串格式 23 print(time.gmtime(time.time()-99999)) # 将utc时间戳转换成struct_time格式 24 25 #将utc struct_time格式转换为指定的字符串格式 26 print(time.strftime("%Y-%m-%d %X",time.gmtime())) #sleep() #线程推迟自定的时间运行,单位为秒 #clock() #这个需要注意啦,在不同的系统上含义不同,在unix系统上,它返回的是'进程时间',用秒表示的浮点数(时间戳) #在windows中,第一次调用,返回的是进程运行的实际时间,而第二次之后的调用是自第一次调用后到现在的运行 #的时间,即两次的时间差
1 import datetime 2 3 #显示当前时间日期 4 print(datetime.datetime.now()) 5 # 2016-12-13 21:58:43.911173 6 7 #当前时间+3天 8 print(datetime.datetime.now() + datetime.timedelta(3)) 9 #2016-12-16 22:01:17.556961 10 11 #当前时间-3天 12 print(datetime.datetime.now() + datetime.timedelta(-3)) 13 #2016-12-10 22:04:18.496310 14 15 #当前时间+30分 16 print(datetime.datetime.now() + datetime.timedelta(hours=3)) 17 #2016-12-14 01:05:43.915196 18 19 #时间替换 20 c_time = datetime.datetime.now() 21 print(c_time.replace(minute=3,hour=2)) 22 #2016-12-13 02:03:14.949403 将小时数与分钟数替换 23 24 #时间戳直接转换为日期格式 25 print(datetime.date.fromtimestamp(time.time())) # 2016-12-13
二random模块
1 import random 2 3 #0,1之间时间生成的浮点数 float 4 print(random.random()) 5 6 #随机生成传入参数范围内的数字 即 1,2,3 7 print(random.randint(1,3)) 8 9 #随机生成传入参数范围内的数字,range顾头不顾尾 10 print(random.randrange(1,3)) 11 12 #随机选择任意一个数字 13 print(random.choice([1,'23',[4,5]])) 14 15 #随机选择任意两个数字 16 print(random.sample([1,'23',[4,5]],2))
小测试:随机生成一个5位数的验证码
1 import random 2 3 def v_code(): 4 code = '' 5 for i in range(5): 6 num = random.randint(0,9) 7 alf = chr(random.randint(65,90)) 8 add = random.choice([num,alf]) 9 code += str(add) 10 return code 11 result = v_code() 12 print(result)
三.os模块
os模块提供对操作系统进行调用的接口
1 import os 2 print(os.getcwd()) 3 获取当前的工作目录,即当前Python脚本工作的目录路径,相当于Linux中的pwd 4 5 print(os.chdir("当前目录名称/../../")) # 改变当前脚本工作目录,相当于shell下的cd 6 7 os.makedirs("dirname1/dirname2") # 可生成多层递归目录 8 os.removedirs("dirname1/dirname2") # 若目录为空,则删除,并递归到上一级目录,如也为空则删除,以此类推
1 import os 2 3 # 获取当前的工作目录,即当前Python脚本工作的目录路径,相当于Linux中的pwd 4 print(os.getcwd()) 5 6 7 print(os.chdir("D:\\PycharmProjects\\fullstack")) # 改变当前脚本工作目录,相当于shell下的cd 8 9 os.makedirs("dirname1/dirname2") # 可生成多层递归目录 10 os.removedirs("dirname1//dirname2") # 若目录为空,则删除,并递归到上一级目录,如也为空则删除,以此类推 11 os.mkdir("dirname") # 生成当级目录,相当于shell中的mkdir dirname