python常用模块总结

Python总共有295个模块,其中一般模块219个(如hashlib、math),以‘’_”开头的模块76个(如_hashlib),这些模块中常用的是collections、time、random、os、sys、序列化(如json)、re、hashlib、configparse、logging。各个常用模块的功能如下:

collections模块

time模块

random模块

os模块

sys模块

序列化模块

re模块

hashlib模块

1、collections模块

collections模块是数据类型扩展模块,主要用来解决一些常规数据类型不容易解决的问题,扩展数据类型主要有counter、deque、namedtuple、defaultdict、orderdict。

 

 1)可双向插入、删除的快速列表deque

from collections import deque,namedtuple,defaultdict,OrderedDict,Counter#此处使用from...import...方式是为了后边使用时不用在加collections.

#两端插入快速列表
salary = deque([2900,3000,3100,3200])
salary.append(3400)#从末尾插入元素
salary.appendleft(2800)#从开头插入元素
print(salary)
salary.pop()#从末尾删除元素
print(salary)
salary.popleft()#从开头删除元素
print(salary)

#运行结果:deque([2800, 2900, 3000, 3100, 3200, 3400])
#运行结果:deque([2800, 2900, 3000, 3100, 3200])
#运行结果:deque([2900, 3000, 3100, 3200])

2)带有名字的元组

 当表示一个规则的空间形状或坐标时,只需要确定其名称和长、宽、高等属性即可,这是利用有名称的

#有名字的元组
#namedtuple('名称', [属性list]):
rectangle = namedtuple('rectangle', ['length', 'width','height'])#创建带名字的元组,第一个rectangle为一个类,第二个rectangle为类型
p = rectangle(1, 2,3)#p为rectangle类的一个实例
print(type(rectangle))
print(type(p))
print(p.length)
print(p.width)
print(p.height)

#运行结果:<class 'type'>
#运行结果:<class '__main__.rectangle'>
#运行结果:1
#运行结果:2
#运行结果:3

3)有默认值的字典

 用途(实例):有一批油管的长度要丈量,其中90%以上的油管长度都是9.60m(出厂规格),这时如果统计油管长度的字典有默认值9.60,就不需要重复输入了

#有默认值的字典
tubelengthdict=defaultdict(lambda :9.60)
tubelengthdict[1]=9.68
tubelengthdict[3]=9.54
for i in range(5):
    print(i,':',tubelengthdict[i],end=' | ')

#运行结果:0 : 9.6 | 1 : 9.68 | 2 : 9.6 | 3 : 9.54 | 4 : 9.6 | 

 4)有序的字典

有序字典是按key插入的先后顺序排序

testdict=OrderedDict({'d':2,'e':3,'f':4})
testdict['a']=1
testdict['g']=5
print(testdict)

#运行结果OrderedDict([('d', 2), ('e', 3), ('f', 4), ('a', 1), ('g', 5)])

5)字符串计数类型Counter

Counter类型用来统计字符串中每个元素出现的次数

staticnum=Counter("ASAFUHAIGBJKCNAUIFHUIHKHFKJLHAKHF")
print(staticnum)
print(type(staticnum))
print(staticnum['H'])

#运行结果:Counter({'H': 6, 'A': 5, 'F': 4, 'K': 4, 'U': 3, 'I': 3, 'J': 2, 'S': 1, 'G': 1, 'B': 1, 'C': 1, 'N': 1, 'L': 1})
#运行结果:<class 'collections.Counter'>
#运行结果:6

 

2、time模块

time模块用来做人与计算机之间的时间交互,共有三种格式:可分为计算机识别的格式(时间戳timestamp)、桥梁时间格式(结构化时间struct_time)、人习惯的格式(字符串格式Format String time)。  

 1)时间的三种格式和两种常用方法

三种时间格式:  

时间戳:表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,数值类型为浮点数,单位为秒;

结构化时间:可以直接转化为时间戳或字符串时间,类型为元祖;

字符串时间:以人习惯的方式表示时间,类型为字符串。

 两种常用方法:

使用时间方法前必须先导入时间模块

#导入时间模块
import time

#两种常用方法
1.time.sleep(secs)
(线程)推迟指定的时间运行,单位为秒。
2.time.time()
获取当前时间戳

三种时间格式实例   

#时间戳(实例)
1536577467.4527252

#结构化时间(实例)
time.struct_time(tm_year=2018, tm_mon=9, tm_mday=10, tm_hour=19, tm_min=4, tm_sec=27, tm_wday=0, tm_yday=253, tm_isdst=0)

#字符串时间
2018-09-10 19:04:27

 

2)三种时间格式的转换方法

转化为时间戳

只有结构化时间可以直接转化为时间戳,使用的函数是mktime(p_tuple)。字符串时间不能直接转化成时间戳。

#转化为时间戳
print(time.mktime(time.localtime()))#time.localtime()获取当前时间的结构化时间(地区),mktime可将结构化时间转化为时间戳

#运行结果:1536578103.0

利用time.time方法也可直接获取当前时间的时间戳

print(time.time())  #获取当前时间的时间戳

#运行结果:1536578103.9763558

转化为结构化时间

 字符串时间转化为结构化时间方法为:strptime(string, format)

#字符串时间转化为结构化时间
print(time.strptime("2018/09/10 19:24:00","%Y/%m/%d %H:%M:%S"))  

#运行结果:time.struct_time(tm_year=2018, tm_mon=9, tm_mday=10, tm_hour=19, tm_min=24, tm_sec=0, tm_wday=0, tm_yday=253, tm_isdst=-1)

 时间戳转化为结构化时间方法为:localtime(seconds=None),gmtime(seconds=None)

#时间戳转化为结构化时间
print(time.localtime())  #获取当前时间的结构化时间(地区)
print(time.gmtime())  #获取当前时间的结构化时间(格林尼治时间

#运行结果:time.struct_time(tm_year=2018, tm_mon=9, tm_mday=10, tm_hour=19, tm_min=25, tm_sec=25, tm_wday=0, tm_yday=253, tm_isdst=0)

#运行结果:time.struct_time(tm_year=2018, tm_mon=9, tm_mday=10, tm_hour=11, tm_min=25, tm_sec=25, tm_wday=0, tm_yday=253, tm_isdst=0)

 转化为字符串时间

结构化时间转化为字符串时间strftime(format, p_tuple=None),asctime(p_tuple=None)
#结构化时间转化为字符串时间
print(time.strftime("%Y/%m/%d %H:%M:%S",time.localtime(1500000000))) #获取输入时间的字符串时间
print(time.asctime(time.localtime())) #获取当前时间的字符串时间,固定格式%a %b %d %H:%M:%S %Y

#运行结果:2017/07/14 10:40:00
#运行结果:Mon Sep 10 19:38:26 2018
时间戳转化为字符串时间:ctime(seconds=None)
#时间戳转化为字符串时间
print(time.ctime(1500000000))#获取输入时间的字符串时间,固定格式%a %b %d %H:%M:%S %Y

#运行结果:Fri Jul 14 10:40:00 2017

 

3)字符串时间补充

在上边的代码中可以看到,字符串时间中有一些带有特殊意义的字母,它们是年、月、日、时、分、秒、星期等的缩写,各个字母与含义的对应表入下:
%y 两位数的年份表示(00-99%Y 四位数的年份表示(000-9999%m 月份(01-12%d 月内中的一天(0-31%H 24小时制小时数(0-23%I 12小时制小时数(01-12%M 分钟数(00=59%S 秒(00-59%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身

 

3、random模块

import random

print(random.random())#获得0-1之间的一个浮点数
print(random.uniform(2,8))#获得2-8之间的一个浮点数
print(random.randint(1,10))#获得1-10之间的一个整数
print(random.randrange(1,100,5))#获得1-100之间每隔5个数组成数组的一个整数
print(random.choice([1,2,3,4,5]))#random.choice(list)随机获得输入list中的一个元素
print(random.sample([1,2,3,4,5],2))#random.choice(list,n)随机获得输入list中的n 个元素


item=[1,3,5,6,7,8,9]
random.shuffle(item)#将item(类型list)打乱重排
print(item)
random.shuffle(item)#将item(类型list)再次打乱重排
print(item)

#运行结果:
0.2795927143951151
5.780736466302746
8
6
3
[5, 2]
[1, 5, 3, 8, 6, 7, 9]
[7, 5, 6, 9, 8, 3, 1]

 

4、os模块

 os模块是与操作系统进行交互的接口。功能主要包括目录的增删改,文件的删改,路径的获取、变更和操作。

1)模块使用前必须先导入

#导入os模块
import os

 

2) 路径的获取、变更和操作

 路径的获取getcwd(),路径的变更os.chdir("dirname"),路径的拼接os.path... 

os.getcwd()# 获取当前工作路径

os.chdir("dirname") #改变当前脚本的工作路径

#os.path系列
#路径返回系列
os.path.abspath(path)#返回输入目录的绝对路径    
os.path.split(path)#将目录和文件名分开以元祖形式返回
os.path.dirname(path)#获取目录
os.path.basename(path)#获取文件名
#路径判断系列
os.path.exists(path)#判断路径是否存在
os.path.isabs(path)#判断是否是绝对路径
os.path.isfile(path)#判断是否是文件
os.path.isdir(path)#判断是否是目录
#路径拼接系列
os.path.join(path,path1,path2,...)#将多个目录拼接在一起,会自动忽略根目录之前的路径
#路径属性获取系列
os.path.getsize(path)#返回路径的大小
os.path.getatime(path)#获取路径最后访问时间
os.path.getmtime(path)#获取路径最后修改时间

 

3)目录的增删改查

 目录的增加makedirs('dirname1/dirname2')、mkdir('dirname'),删除removedirs('dirname')、rmdir('dirname'),重命名rename('oldname','newname')、查os.stat('path/filename')

makedirs('dirname1/dirname2')#增加一个或一串目录
mkdir('dirname')#增加一个目录
removedirs('dirname')#删除一个或一串(父目录为空时)目录
rmdir('dirname')#删除一个目录
rename('oldname','newname')#重命名一个目录
os.stat('path/filename')#获取文件/目录信息

4)文件的删改查

文件之所以没有“增加”操作,是因为以写方式打开一个文件,保存时如果问价不存在会自动创建。文件的删除remove('filename')、重命名rename('oldname','newname')、查os.stat('path/filename')  

remove('filename')#删除一个文件
rename('oldname','newname')#重命名一个文件
os.stat('path/filename')  #获取文件/目录信息

5、sys模块

 sys模块是用来获取、设置操作系统和编译器参数的。常用的方法如下:

import sys
sys.argv#运行该脚本时,用户从外部输入的数据以list形式存在sys.argv中,sys.argv[0]是文件本身路径
sys.exit(0)#退出程序,不报异常;当参数为1时,退出程序报SystemExit异常
sys.path#返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值;利用sys.path.append()可以添加环境变量
sys.version#返回解释器的版本信息
sys.platform#返回操作系统名称(不准)
sys.getdefaultencoding()#获取系统当前编码
sys.getfilesystemencoding()#获取文件系统使用编码方式

6、序列化模块(如json)

 python是一门高级语言,高级语言的某些数据结构低级语言是不能识别的,这使得在传送python数据结构时只能转化成低级语言识别的数据,而json序列话就是将python数据类型转化成str,反序列化就是将str转化成python数据类型。与eval不一样json只能实现数据类型和str之间的转化,并不能执行其他代码,所以使得安全性有了保障。

import json

#dumps和loads
dic={'name':'lv','age':26,'tel':6224,520:186343}
print(dic)#{'name': 'lv', 'age': 26, 'tel': 6224, 520: 186343}
str_dic=json.dumps(dic)#将字典转化为字符串,序列化过程
print(type(str_dic),str_dic)#<class 'str'> {"name": "lv", "age": 26, "tel": 6224, "520": 186343}
load_dic=json.loads(str_dic)#将json字符串转化字典,反序列化过程
print(type(load_dic),load_dic)#<class 'dict'> {'name': 'lv', 'age': 26, 'tel': 6224, '520': 186343}
import json

#dump和load
f=open('json_file','w')
dic={'name':'lv','age':26,'tel':6224,520:186343}
json.dump(dic,f)#将字典转化为字符串,并写入文件中
f.close()
f=open('json_file','r')
load_dic=json.load(f)#将json文件转化字典,反序列化过程
print(type(load_dic),load_dic)#<class 'dict'> {'name': 'lv', 'age': 26, 'tel': 6224, '520': 186343}
f.close()

除json外,pickle也能实现类似的功能,用法与json类似,此处就不介绍了。

 

7、re模块

 re模块是用来验证、查找满足规则的字符的。在Python中,如果在‘ahfiababoi13863615567aafga5ga54a5a54g5a4w5eaa31f3a47aw’要查找“13863615567”,可以利用字符串切片加for循环查找的方式,但这种方式比较繁琐,有没有什么简便的方法呢?

此处为大家介绍正则表达式,正则表达式用来检索、替换那些符合某个模式(规则)的文本的。

1)正则表达式

正则表达式之所以比单个查找比对字符简单,是因为它用特殊含义的字符和量词组合表示模式(规则),接下来将分字符组(基本概念)、特殊含义字符、量词、组合含义四部分为大家介绍。

字符组

‘af’、'ad'、'1sf'、'ad1'、'e8'、'rty'、's4'、'l4x'、'adf'、'784'、'4sw'......假设现在有10000个长度不等的字符串,要查找出其中所有“数字+字母”的组合,这是用Python字符串的操作方法会比较繁琐,用正则表达式只需[a-zA-Z][0-9]即可。一个[]代表一个字符组,括号中填写需要匹配的所有字符即可,每个[]只能匹配一个字符。

正则
待匹配字符
匹配
结果
说明
[0123456789]
8
True
在一个字符组里枚举合法的所有字符,字符组里的任意一个字符
和"待匹配字符"相同都视为可以匹配
[0123456789]
a
False
由于字符组中没有"a"字符,所以不能匹配
 
[0-9]
 
7
True
也可以用-表示范围,[0-9]就和[0123456789]是一个意思
 
[a-z]
 
s
 
True
 
同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
 
[A-Z]
 
B
 
True
 
[A-Z]就表示所有的大写字母
 
[0-9a-fA-F]
 
e
 
True
 
可以匹配数字,大小写形式的a~f,用来验证十六进制字符

特殊含义字符

 假如要表示字母或数字或下划线,根据上边的规则为[a-zA-Z0-9_],用特殊含义字符为[\w],可见使用特殊含义字符能简化表达式。

特殊含义字符表:

 
元字符
 
匹配内容
匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的结尾
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W
匹配非字母或数字或下划线
\D
匹配非数字
\S
匹配非空白符
a|b
匹配字符a或字符b
()
匹配括号内的表达式,也表示一个组
[...]
匹配字符组中的字符
[^...]
匹配除了字符组中字符的所有字符

正则表达式中的量词

当限制匹配次数时就要用到量词。

量词:

量词 含义
* 表示重复0次或多次
+ 表示重复1次或多次
表示重复0次或1次
{n} 表示重复n次
{n,} 表示重复大于或等于n次
{n,m} 表示重复n到m次

 字符量词的组合

.^$表示以.结尾的字符,如‘[吕][.]?[永]$’表示匹配姓‘吕’以‘永’结尾的名字
.?比配0次或1次任意字符
.*表示匹配任意字符尽量多的次数
r'\n'字符r为非转义,表示屁匹配‘/n’,不是匹配回车符
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复    

分组与命名分组

>>> s='<div><a href="https://support.google.com/chrome/?p=ui_hotword_search" target="_blank">更多</a><p>dfsl</p></div>'
>>> print re.search(r'<a.*>(.*)</a>',s).group(1)
#通过命名分组进行后向引用
>>> re.search(r'(?P<name>go)\s+(?P=name)\s+(?P=name)', 'go go go').group('name')
'go'
#通过默认分组编号进行后向引用
>>> re.search(r'(go)\s+\1\s+\1', 'go go go').group()
'go go go'

2)re模块

 re模块方法主要有findall(pattern, string, flags=0)、search(pattern, string, flags=0)、match(pattern, string, flags=0)、split(pattern, string, maxsplit=0, flags=0)、sub(pattern, repl, string, count=0, flags=0)、compile(pattern, flags=0)、finditer(pattern, string, flags=0)

import re

ret=re.findall('l','uyhsfvafvbiusahjhgklahklalalahe')#以列表方式返回所有满足条件的结果
print(ret)

ret=re.search('l','uyhsfvafvbiusahjhgklahklalalahe')#匹配满足条件的结果1次
print(ret.group())#调用group方法显示结果,类型为字符串

ret=re.match('l','luyhsfvafvbiusahjhgklahklalalahe')#在匹配对象开始处匹配满足条件的结果1次
print(ret.group())#调用group方法显示结果,类型为字符串

ret=re.split('l','uyhsfvafvbiusahjhgklahklalalahe')#将字符串以‘l’分割,并以列表方式返回分割后的结果
print(ret)

ret=re.sub('old','new','uyhsfvafvbiusahjhgkoldlahkoldalalahe')#将字符串中的'old'替换为'new',以元祖方式返回替换后额结果和替换次数
print(ret)

obj = re.compile('\d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc748ajakh') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group()) 

ret = re.finditer('[a-z]', 'a4fa85a4ga7ga4d')   #finditer返回一个存放匹配结果的迭代器
print(ret)
for i in ret:
    print([i.group()]) 


#运行结果:['l', 'l', 'l', 'l']
#运行结果:l
#运行结果:l
#运行结果:['uyhsfvafvbiusahjhgk', 'ahk', 'a', 'a', 'ahe']
#运行结果:uyhsfvafvbiusahjhgknewlahknewalalahe
#运行结果:748
#运行结果:<callable_iterator object at 0x7f2cccc21940>
#运行结果:['a']['f']['a']['a']['g']['a']['g']['a']['d']

  

8、hashlib模块

登录一个网站时,用户需要输入用户名和密码。用户名和密码一般存储在数据库或表格文件中,如果以明文方式存储,一旦密码遭泄露或破解将会造成难以预料的后果。哪有没有什么方法来避免这个问题呢?这就要用到我们今天要将的hashlib模块。

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

import hashlib

md5=hashlib.md5()#创建hash对象
md5.update(b'how are you?')
print(md5.hexdigest())#将hash对象转化为32为的16进制字符串


#运行结果:35179a54ea587953021400eb0cd23201

为了确保用户输入简单密码时也不容易被盗号,就要用到“加盐”算法,说白了就是先将用户的密码与一个字符串拼接,然后再进行整体加密。

import hashlib

md5=hashlib.md5("salt".encode("utf8"))#创建hash对象时进行加盐
md5.update(b'how are')
md5.update(b' you?')#update可以分多次完成,结果不变
print(type(md5.hexdigest()),md5.hexdigest())


#运行结果:1a9d6204f6be8bea3a1ac1ebf696197a

SHA1算法与MD5算法基本相同(只不过将代码中的md5改为sha1),只不过加密后生成的字符串为40为的16进制字符,更安全也更慢。

import hashlib

sha1=hashlib.sha1("salt".encode("utf8"))
sha1.update(b'how are')
sha1.update(b' you?')
print(sha1.hexdigest())


#运行结果:225883ca4521455793e98eea3a03e8013b240de6

 

 

posted @ 2018-09-18 11:27  海予心  阅读(1193)  评论(0编辑  收藏  举报