什么是模块?
常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
但其实import加载的模块分为四个通用类别:
1 使用python编写的代码(.py文件)
2 已被编译为共享库或DLL的C或C++扩展
3 包好一组模块的包
4 使用C编写并链接到python解释器的内置模块
为何要使用模块?
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用
1.random模块
import random print(random.random()) #随机打印0-1的小数
print(random.uniform(1,2))#随机打印大于1小于2的小数
import random print(random.randint(1,6))# 随机打印1-6之间整数 print(random.randrange(1,100,(2))) #随机打印1-100的奇数
print(random.choice([1,2,(23,45),[12,232]])) #随机打印列表中的一个元素 print(random.sample([1,2,(23,45),[12,232]],3)) #随机打印列表中3个元素,函数中第二个参数决定打印元素个数
l = [1,2,5,4,7,8,12] random.shuffle(l) print(l) #打乱列表顺序
2.时间模块
time模块主要是和时间打交道,通常有三种方式来表达:
(1) 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.在运行"type(time.time())",返回的是float类型
(2)格式化的时间字符串(format string):"1999-12-06"
(3)结构化时间(struct-time) :打印的元组中有9个元素(年,月,日,时,分,秒,一年中的第几周,一年中的第几天等)
我们来认识一下python中表示时间的几种格式
import time print(time.localtime()) 结构化时间 #time.struct_time(tm_year=2018, tm_mon=8, tm_mday=20, tm_hour=16, tm_min=4, tm_sec=33, tm_wday=0, tm_yday=232, tm_isdst=0) print(time.time()) 时间戳时间 #1534752719.7024927 print(time.strftime("%Y-%m-%d %H-%M-%S")) 打印时间字符串 #2018-08-20 16-14-23
时间戳是计算机能够识别的时间;时间字符串是人能够看懂的格式;结构化时间则是用来操作时间的.
三种时间格式的转化
(时间字符串) strptime (结构化时间) mktime (时间戳)
Format string< = = = >struct_time < = = = > Timestamp
strftime localtime(gmtime伦敦时间)
结构化时间(struct_time)转化为字符串格式:asctime
时间戳(Timestamp)转化为字符串格式:ctime
3.sys模块
sys模块是与python解释器交互的接口
sys.argv argv的第一个参数 ,是python这个命令后面的值
sys.exit 退出程序,正常退出是exit(0),错误退出时sys.exit(1)
sys.path 返回模块的搜索路径
4.os模块
os模块是与操作系统交互的一个接口
os.mkdir('dir') 生成单级目录
os.makedirs('dir1/dir2') 可生成多层递归目录
os.rmdir(dir) 删除单级目录,若目录不为空则无法删除
os.removedirs(dir) 若目录为空,则删除,并递归到上一级目录,若也为空,则删除,以此类推
os.listdir(dir)/os.path.jion 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir(""dirname) 改变当前脚本工作目录,相当于shell下cd
os.path.abspath() 能够把找到的相对路径改成绝对路径
os.path.split() 就是把一个路径分成两段,第二段是一个文件/文件夹os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 *如果俩个值都需要,就用os.path.split,如果你只要一个值 :os.path.dirname/os.path.basename
os.path.exists() 判断文件/文件夹是否存在
os.path.getsize() 查看文件大小;所有文件夹都至少是4096/8192个字节
os.system('bash command') 运行shell命令,直接显示
os.popen("bash command").read() 运行shell命令,获取执行结果
5.序列化模块
序列化就是把其他的数据类型转化成字符串,bytes的过程
1.json模块
在内存中做数据转化:
dumps数据类型转化成字符串 序列化
loads字符串转成数据类型 反序列化
dump load 直接将数据类型写入文件,直接从文件中读出数据类型
json是所有语言都通用的一种序列化格式,只支持列表,字典(字典的key必须是字符串),字符串,数字
2.pickle
只能在python中使用,支持所有在python中几乎所有的数据类型
dumps序列化的结果只能是字节,在和文件操作的时候,需要用rb,wb的模式打开文件
可以多次dump和多次load
6.re模块
一.注意:
永远不要起一个py文件的名字,这个名字和你已知的模块同名
二正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
三.正则表达式的运用
1.字符组
[0-9] 匹配的是[0123456789]的范围。
[a-z] 匹配的是所有的小写字母。
[A-Z] 表示所有的大写字母。
[0-9a-fA-F] 可以匹配数字,大小写形式的a-f,用来验证十六进制字符。
2.字符
. 表示匹配除换行符以外的任意字符
w 匹配字母或数字或下划线
s 匹配任意空白符 ( space)
d 匹配数字
匹配一个换行符
匹配一个制表符
匹配一个单词的结尾
^ 匹配字符串的开始
$ 匹配字符串的结尾
W 匹配非字母或数字或下划线
D 匹配非数字
S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符
3.量词
* 重复0次或者更多次
+ 重复一次或更多次
? 重复0次或者一次
{n} 重复n次
{n,} 重复n次或者更多次
{n,m} 重复n到m次
四.正则表达式特点
1.贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
.* 默认为贪婪匹配模式,会匹配尽量长的字符串
.*? 加上?为将贪婪模式转为非贪婪模式,会匹配尽量短的字符串
2.几个常用的非贪婪匹配的Pattern
*? 重复任意次,但尽可能少重复
+? 重复一次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
(n,)? 重复n次以上,但尽可能少重复
. *?的用法
取尽量少的任意字符,一般不会这么单独写,他大多用在:.*?x就是取前面任意长度的字符,直到一个x出现
五.re模块的使用
引用 import re
1.查找
findall:匹配所有 每一项都是列表中的一个元素,返回列表
import re
ret = re.findall("d+","123xixi34haha56")
print(ret) #打印"123","34","56"
2.
search: 只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的group方法来获取结果.
如果没有匹配到,会返回None,使用group会报错.
import re
ret = re.search("d+","123xixi34haha56")
print(ret.group()) #打印"123"
3.
match :从头开始匹配,相当于search中的正则表达式加一个^
import re
ret = re.match("d+","i123xixi34haha56")
print(ret) #打印None
print(ret.group()) #group 报错
4.字符串的处理扩展:替换,切割
split 返回列表,按照正则规则切割,默认匹配到的内容会被切掉
import re
s = "1酸甜口2鲜香口3香辣味"
ret = re.split("d",s)
print(ret) #打印"酸甜口","鲜香口"."香辣味"
5.sub #谁 旧的 新的 替换次数
import re
ret = re.sub("d","K","i123xixi34haha56",3)
print(ret) #打印中"123"被替换为"KKK",如果语法中不加3,则默认数字全被替换味为"K"
6. subn 返回一个元组,第二个元素是替换的次数
import re
ret = re.subn("d","K","i123xixi34haha56")
print(ret) #('iKKKxixiKKhahaKK', 7)
7.re模块的进阶:时间/空间
compile 节省使用正则表达式的时间
编译正则表达式 →字节码,在多次使用的过程中,不用再多次编译.
用这个结果去 search,match,findall,finditer 能都节省时间
import re
res = re.compile("d+")
ret = res.findall("i123xixi34haha56")
print(ret)
ret = res.search("i123xixi34haha56")
print(ret.group())
finditer 节省使用正则表达式解决问题的空间/内存
返回一个迭代器.所有结果都在这个迭代器中,需要通过循环+group的形式取值,能够节省内存.
import re
ret = re.finditer("d+","i123xixi34haha56")
print(ret) #打印内存地址
for i in ret:
print(i.group()) 依次打印"123","34","56"