Python中的模块

模块对我来说是什么

​ 模块对我来说,感觉就像亲属或者朋友已经走过的路,他们已经趟过的浑水、掉过的坑、践行过的路线,全部提供给你,在你需要的时候请求帮助,借鉴他们的解决方法一样。都是为了方便走好人生路,用最短的路程走到成功的终点。

内置模块就像亲属,生来即有;自定义模块就像自己走过一次的路,吃一堑长一智做好了攻略,下次按攻略来就可以;第三方模块就像之后接触到的朋友,他们成功的经验借鉴给你,自己选择,规避坑陷。

模块调用的方法

import 模块名
from 模块名 import 方法名

emmm……python官方的开源模块库下载地址(防遗忘)

https://pypi.python.org/pypiarrow-up-right

内置模块

time/datetime模块(还有一个calendar模块,只了解过)

​ 处理与时间有关的,感觉目前时间模块我多用于测试(例如:time.sleep( ))和日志中。

特别重要,也是使用次数较多的:

​ 在写方法前先解释下时间戳、结构化时间、字符串时间这些概念,当然也防止自己以后再看到时间戳的时候怀疑自己这是个啥玩意儿。

时间戳:1970纪元后经过的浮点秒数。

结构化时间:输出结果是这种的,以时间是由什么结构组成的输出,总之方便调用或修改。(tm_year,tm_mon,tm_mday,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)

字符串时间:就是正常显示的时间

​ time.time():获取当前时间的时间戳

​ 这里例一个字符串时间t:

字符串转结构化用的是time.strptime()

结构化转为字符串用的是time.strftime()

我以strp和strf来区别,p代表输入,f代表格式化输出,当然这是我的区别方法,至于是不是真的代表这个意思就不是很清楚了。

time是datetime的底层模块,貌似我不怎么用到,这里就不详写了。

random、hmac模块(随机模块,做验证客户端合法性的hmac模块)

random模块特别重要,实现随机数功能,或随机抽取这种的都需要用到它。

hmac模块(做验证客户端合法性的,虽然我觉得它有可能不止用在验证合法性。)

os.urandom(32):随机的32位字节,每执行一次变一次

os模块

得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()

返回指定目录下的所有文件和目录名:os.listdir()

函数用来删除一个文件:os.remove()

删除多个目录:os.removedirs(r“c:\python”)

检验给出的路径是否是一个文件:os.path.isfile()

检验给出的路径是否是一个目录:os.path.isdir()

判断是否是绝对路径:os.path.isabs()

检验给出的路径是否真地存:os.path.exists()

返回一个路径的目录名和文件名:os.path.split() e.g os.path.split('/home/swaroop/byte/code/poem.txt') 结果:('/home/swaroop/byte/code', 'poem.txt')

分离扩展名:os.path.splitext() e.g os.path.splitext('/usr/local/test.py') 结果:('/usr/local/test', '.py')

获取路径名:os.path.dirname()

获得绝对路径: os.path.abspath()

获取文件名:os.path.basename()

运行shell命令: os.system()

读取操作系统环境变量HOME的值:os.getenv("HOME")

返回操作系统所有的环境变量: os.environ

设置系统环境变量,仅程序运行时有效:os.environ.setdefault('HOME','/home/zhao')

给出当前平台使用的行终止符:os.linesep Windows使用'\r\n',Linux and MAC使用'\n'

指示你正在使用的平台:os.name 对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'

重命名:os.rename(old, new)

创建多级目录:os.makedirs(r“c:\python\test”)

创建单个目录:os.mkdir(“test”)

获取文件属性:os.stat(file)

修改文件权限与时间戳:os.chmod(file)

获取文件大小:os.path.getsize(filename)

结合目录名与文件名:os.path.join(dir,filename)

改变工作目录到dirname: os.chdir(dirname)

获取当前终端的大小: os.get_terminal_size()

杀死进程: os.kill(10884,signal.SIGKILL)

1568972609275

sys模块

这个模块我一般多用于反射和递归深度里

序列化模块(json/pickle/shelve模块)

序列化:差不多就是把任何数据类型转换成str/bytes的过程。

pickle模块(字节间的相互转换,mode=’wb’):

1568972732206

json和pickle的优缺点:

json:

​ 优点:跨语言、体积小

​ 缺点:只能支持Int\str\list\tuple\dict

pickle:

​ 优点:专为python设计,支持python所有的数据类型

​ 缺点:只能在python中使用,存储数据占空间大

shelve模块(不怎么了解,copy的):

​ shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式

序列化:

反序列化:

hashlib模块(加密)

hashlib包括:MD5,sha1,sha256,sha512

加密步骤:

  1. 先导入模块

  2. 创建一个加密方式

  3. 将要加密的内容编码成字节后加密

  4. 生成密文

logging模块(日志模块)

​ 日志模块可以记录正常的访问操作日志,而且可以记录错误、警告等信息,可以更直观的告诉开发应该注意哪里的问题。

​ python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug(), info(), warning(), error() and critical()5个级别,下面我们看一下怎么用。

为什么要写日志

​ 一个卡务系统 : 记录时间 地点 金额

​ 谁在什么时候 删掉了某一个用户

​ 某时某刻登录了系统

​ 检测代码是不是像我们想像的这样执行的

写文件 ,输出到屏幕

时间格式,级别控制,更加便捷

logging模块不能自动生成你需要的日志

logging模块的使用

re模块(正则)

正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re。 常用的表达式规则:

re的匹配语法:

找到所有的符合正则表达式的内容,返回一个列表

找到所有的符合正则表达式的内容,返回一个迭代器

找到第一个符合正则表达式的内容就停止,通过group取值,找不到时ret返回None,ret.group报错,所以一般if ret:和ret.group搭配使用

从头开始找第一个。用ret.group取值

找到符合条件的默认替换所有,设置换n次

找到符合条件的替换,并返回出现了几次

分为列表

abc模块(抽象类)

抽象类概念:是一个特殊的类,只能被继承,不能实例化

抽象类的意义:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。这一点与接口有点类似,但其实是不同的,看以下示例。

示例代码:

multiprocessing模块(多进程模块)

第一次接触到它是在多进程中,使用它里面的Process类可以达到异步传输的效果,使用方法如下:

开启的子进程:

​ 需要注意的是:下面标红区域必须是元组,当只传一个值时,必须也为元组形式。

multiprocessing中的方法:

Lock

同一时间点上只有一个进程可以进行操作,lock.acquire() 获取钥匙 如果这个人没拿走钥匙,那么就可以直接进入下面的代码;如果有人拿走了钥匙,则需等待钥匙归还后才可以进入下面的代码。lock.release() 归还钥匙

锁的应用场景:当多个进程需要操作同一个文件/数据库时,需要通过加锁

Queue 队列

队列是进程安全的,自带了锁调节生产者的个数或者消费者的个数来让程序的效率达到最平衡和最大化

Manager 共享资源

Manager类的作用共享资源,manger的的优点是可以在poor进程池中使用,缺点是windows下环境下性能比较差,因为windows平台需要把Manager.list放在if name='main'下,而在实例化子进程时,必须把Manager对象传递给子进程,否则lists无法被共享,而这个过程会消耗巨大资源,因此性能很差。

threading模块(处理多线程)

threading模块和multiprocessing模块

​ 先有的threading模块

​ 没有池的功能

multiprocessing完全模仿threading模块完成的

​ 实现了池的功能

concurrent.futures

​ 实现了线程池\进程池

一个进程中的多线程:

注:

在线程部分不需要通过import来为新的线程获取代码

因为新的线程和之前的主线程共享同一段代码

不需要import 也就不存在在子线程中又重复了一次创建线程的操作

所以就不必要if name==’main’

threading 与 multiprocessing效率对比(代码):

结果:

1568974421387

多个线程之间的全局变量是共享的,进程是数据隔离的(代码):

结果:

1568974455033

进程是数据隔离的(代码):

结果:

1568974482508

threading模块提供的方法:

threading.currentThread(): 返回当前的线程变量。

threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。

threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

threading.enumerate():返回一个存储着所有线程对象的列表

threading.Lock():锁

1568974525191

线程有terminate么?

​ 没有terminate 不能强制结束

所有的子线程都会在执行完所有的任务之后自动结束

collections

collections模块在内置数据类型(dict、list、set、tuple)的基础上,还提供了几个额外的数据类型:ChainMap、Counter、deque、defaultdict、namedtuple和OrderedDict等。

  1. namedtuple: 生成可以使用名字来访问元素内容的tuple子类

  2. deque: 双端队列,可以快速的从另外一侧追加和推出对象

  3. Counter: 计数器,主要用来计数

  4. OrderedDict: 有序字典

  5. defaultdict: 带有默认值的字

Last updated