Python常用模块
Python常用模块
什么是模块
模块支持从逻辑上组织Python代码。当代码量变得相当大的时候。我们最好把代码分成一些有组织的代码段,前提是保证他们彼此交互。这些代码片段相互间有一定的联系。可能是一个包含数据成员的方法的类,也可能是一组相关但彼此独立的操作函数。这些代码段是共享的,所以Python允许‘调入’一个模块,允许使用其他模块的属性来利用之前的工作成果,实现代码重用。这个把其他模块中属性附加到你的模块中的操作叫做导入(import)。那些自我包含并且有组织的代码片段就是模块。
collections模块
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
方法或函数 | 解释 |
---|---|
namedtuple | 生成可以使用名字来访问元素内容的tuple |
deque: | 双端队列,可以快速的从另外一侧追加和推出对象 |
Counter | 计数器,主要用来计数 |
OrderedDict | 有序字典 |
defaultdict | 带有默认值的字典 |
namedtuple
我们知道tuple可以表示不变集合,例如一张扑克牌的花色和数字
p = ('红桃','Q')
但是,看到(‘红桃’,‘Q’),很难看出这个tuple是用来表示一张扑克牌的。
这是namedtuple就排上用场了。
from collections import namedtuple
card = namedtuple('card',['suits','number'])
p1 = card('红桃',2)
print(p1)
print(p1.number)
print(p1.suits)
#结果
card(suits='红桃', number=2)
2
红桃
deque
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
from collections import deque
dq = deque([1,2])
dq.append('a') #后面放数据
dq.appendleft('b') #从前面放数据
dq.insert(1,3) #插入需指定插入下标
print(dq.pop()) #从后面取数据
print(dq.popleft()) #从前面取数据
print(dq.popleft()) #从前面取数据\
print(dq)
#结果
a
b
3
deque([1, 2])
Counter
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
c = Counter('abcdeabcdabcaba')
print c
#结果
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
OrderedDict
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict:
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
d # dict的Key是无序的
{'a': 1, 'c': 3, 'b': 2}
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
od # OrderedDict的Key是有序的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
od.keys() # 按照插入的Key的顺序返回
['z', 'y', 'x']
defaultdict
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key1'] # key1存在
'abc'
dd['key2'] # key2不存在,返回默认值
'N/A
time模块
和时间有关系的我们就要用到时间模块。在使用模块之前,应该首先导入这个模块。
常用方法或函数
方法或函数 | 作用 |
---|---|
sleep(secs) | 程序执行推迟指定时间 |
time() | 获取当前的时间戳 |
strftime() | 格式化时间 |
localtime() | 结构化时间(时间戳转结构化) |
gmtime() | 格林威治时间(时间戳转结构化) |
strptime() | 格式化时间转结构化时间 |
mktime() | 结构化转时间戳 |
下面我们看看各种时间都是什么样子的
python表示时间的方式
#导入时间模块
>>>import time
#时间戳
>>>time.time()
#导入时间模块
>>>import time
#时间戳
>>>time.time()
1537780785.2919068
#时间字符串
>>>time.strftime("%Y-%m-%d %X")
'2018-09-24 17:20:33'
>>>time.strftime("%Y-%m-%d %H-%M-%S")
'2018-09-24 17-20-45'
#时间元组:localtime将一个时间戳转换为当前时区的struct_time
time.localtime()
time.struct_time(tm_year=2018, tm_mon=9, tm_mday=24, tm_hour=17, tm_min=20, tm_sec=59, tm_wday=0, tm_yday=267, tm_isdst=0)
小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的
几种格式的转换
#时间戳-->结构化时间
#time.gmtime(时间戳) #UTC时间,与英国伦敦当地时间一致
#time.localtime(时间戳) #当地时间。例如我们现在在北京执行这个方法:与UTC时间相差8小时,UTC时间+8小时 = 北京时间
time.gmtime(1500000000)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=2, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
time.localtime(1500000000)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
#结构化时间-->时间戳
#time.mktime(结构化时间)
time_tuple = time.localtime(1500000000)
time.mktime(time_tuple)
1500000000.0
结构化时间
索引(Index) | 属性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | 比如2011 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(时) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 60 |
6 | tm_wday(weekday) | 0 - 6(0表示周一) |
7 | tm_yday(一年中的第几天) | 1 - 366 |
8 | tm_isdst(是否是夏令时) | 默认为0 |
#结构化时间-->字符串时间
#time.strftime("格式定义","结构化时间") 结构化时间参数若不传,则显示当前时间
>>>time.strftime("%Y-%m-%d %X")
'2018-09-24 17:20:33'
>>>time.strftime("%Y-%m-%d",time.localtime(1500000000))
'2017-07-14'
#字符串时间-->结构化时间
#time.strptime(时间字符串,字符串对应格式)
time.strptime("2017-03-16","%Y-%m-%d")
time.struct_time(tm_year=2017, tm_mon=3, tm_mday=16, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=75, tm_isdst=-1)
>time.strptime("07/24/2017","%m/%d/%Y")
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)
特殊的时间方式(linux中date命令的默认输出)
#结构化时间 --> %a %b %d %H:%M:%S %Y串
#time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串
time.asctime(time.localtime(1500000000))
'Fri Jul 14 10:40:00 2017'
time.asctime()
'Mon Sep 24 17:47:43 2018'
#时间戳 --> %a %b %d %H:%M:%S %Y串
time.ctime()
'Mon Sep 24 17:48:24 2018'
time.ctime(1500000000)
'Fri Jul 14 10:40:00 2017'
random模块
常用函数
方法或函数 | 解释 |
---|---|
random() | 生成指定范围之间的小数 |
randint() | 生成指定范围内的整数 |
choice() | 从指定的参数中随机返回一个 |
sample() | 从指定的参数中随机返回指定个数的值 |
shuffle() | 打乱指定列表的次序 |
import random
#随机小数
random.random() # 大于0且小于1之间的小数
0.7664338663654585
random.uniform(1,3) #大于1小于3的小数
1.6270147180533838
#随机整数
random.randint(1,5) # 大于等于1且小于等于5之间的整数
random.randrange(1,10,2) # 大于等于1且小于10之间的奇数
#随机选择一个返回
random.choice([1,'23',[4,5]]) # #1或者23或者[4,5]
#随机选择多个返回,返回的个数为函数的第二个参数
random.sample([1,'23',[4,5]],2) # #列表元素任意2个组合
[[4, 5], '23']
#打乱列表顺序
item=[2,3,5,6,9]
random.shuffle(item) # 打乱次序
item
[5, 2, 3, 6, 9]
random.shuffle(item)
item
[5, 9, 6, 2, 3]
os模块
常用方法和函数
方法或函数 | 解释 |
---|---|
os.makedirs(‘dirname1/dirname2’) | 可生成多层递归目录 |
os.removedirs(‘dirname1’) | 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 |
os.mkdir(‘dirname’) | 生成单级目录;相当于shell中mkdir dirname |
os.rmdir(‘dirname’) | 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname |
os.listdir(‘dirname’) | 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 |
os.remove() | 删除一个文件 |
os.rename(“oldname”,“newname”) | 重命名文件/目录 |
os.stat(‘path/filename’) | 获取文件/目录信息 |
os.system(“bash command”) | 运行shell命令,直接显示 |
os.popen("bash command).read() | 运行shell命令,获取执行结果 |
os.getcwd() | 获取当前工作目录,即当前python脚本工作的目录路径 |
os.chdir(“dirname”) | 改变当前脚本工作目录;相当于shell下cd |
注意:os.stat(‘path/filename’) 获取文件/目录信息 的结构说明
stat 结构:
名称 | 解释 |
---|---|
st_mode | inode 保护模式 |
st_ino | inode 节点号。 |
st_dev: | inode 驻留的设备。 |
st_nlink | inode 的链接数。 |
st_uid | 所有者的用户ID。 |
st_gid | 所有者的组ID。 |
st_size | 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 |
st_atime | 上次访问的时间。 |
st_mtime | 最后一次修改的时间。 |
st_ctime | 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。 |
os.path类
方法或函数 | 解释 |
---|---|
os.path.abspath(path) | 返回path规范化的绝对路径 |
os.path.split(path) | 将path分割成目录和文件名二元组返回 |
os.path.dirname(path) | 返回path的目录。其实就是os.path.split(path)的第一个元素 |
os.path.basename(path) | 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 |
os.path.exists(path) | 如果path存在,返回True;如果path不存在,返回False |
os.path.isabs(path) | 如果path是绝对路径,返回True |
os.path.isfile(path) | 如果path是一个存在的文件,返回True。否则返回False |
os.path.isdir(path) | 如果path是一个存在的目录,则返回True。否则返回False |
os.path.join(path1[, path2[, …]]) | 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 |
os.path.getatime(path) | 返回path所指向的文件或者目录的最后访问时间 |
os.path.getmtime(path) | 返回path所指向的文件或者目录的最后修改时间 |
os.path.getsize(path) | 返回path的大小 |
特别注意下图的方法
方法 | 解释 |
---|---|
os.sep | 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" |
os.linesep | 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n" |
os.pathsep | 输出用于分割文件路径的字符串 win下为;,Linux下为: |
os.name | 输出字符串指示当前使用平台。win->‘nt’; Linux->‘posix’ |