常用的模块

什么是模块?

   常见的场景:一个模块就是一个包含了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"
原文地址:https://www.cnblogs.com/liuqingyang/p/9506708.html