常用模块一
collections
collections是Python内建的一个集合模块,提供了许多有用的集合类。
在内置数据集合类型(dict, list, set, tuple) 的基础上, collections 模块还提供了几个额外的数据类型: Counter, deque, defaultdict, namedtuple 和 OrderedDict等.
- namedtuple: 生成可以使用名字来访问元素内容的 tuple.
- deque: 双端队列,可以快速的从另外一侧追加和推出对象.
- Counter: 计数器,主要用来计数.
- OrderedDict: 有序字典.
- defaultdict: 带有默认值的字典.
namedtuple
使用方法: namedtuple('名称', [属性 list])
from collections import namedtuple
Point = namedtuple('Point',['x','y'])
p = Point(1,2)
print(p.x,p.y) # 根据属性取值
deque
使用 list 存储数据时,按照索引方式访问很快,但是插入数据和删除数据很慢,因为 list 是线性存储.数据量大的时候删除和插入数据都很慢效率很低.
deque 是为了实现高效的插入和删除操作的双向列表,适用于队列和栈.
from collections import deque
dq = deque([1,2]) # 创建一个队列
dq.append('a') # 从后面放入一个数据 [1, 2, 'a']
dq.appendleft('b') # 从前面放入一个数据 ['b', 1, 2, 'a']
dq.insert(2,3) # 插入一条数据 在某值前面 插入数据 ['b', 1, 3, 2, 'a']
print(dq.pop()) # 从后面取值 a
print(dq.popleft()) # 从前面取值 b
print(dq) #deque(['b', 1, 3, 2, 'a'])
import queue q = queue.Queue() q.put([1,2,3]) q.put(5) q.put(6) print(q.qsize()) print(q.get()) # 取不到值会阻塞 [1, 2, 3]
OrderedDict
使用 dic 时, Key 是无序的. 在对 dict 做迭代时,我们无法确定 Key 的顺序.
如果要保持 key 的顺序,可以使用 OrderedDict:
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d) # dict的Key是无序的
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # 此时是有序的
od['d']='4'
od['e']='5'
print(od.keys()) # odict_keys(['a', 'b', 'c', 'd', 'e'])
defaultdict
有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66 , 'k2': 小于66}
1 values = [11, 22, 33,44,55,66,77,88,99,90] 2 3 my_dict = {} 4 5 for value in values: 6 if value>66: 7 if 'k1' in my_dict: 8 my_dict['k1'].append(value) 9 else: 10 my_dict['k1'] = [value] 11 else: 12 if 'k2' in my_dict: 13 my_dict['k2'].append(value) 14 else: 15 my_dict['k2'] = [value] 16 print(my_dict) # {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]}
1 from collections import defaultdict 2 3 values = [11, 22, 33,44,55,66,77,88,99,90] 4 5 my_dict = defaultdict(list) 6 7 for value in values: 8 if value>66: 9 my_dict['k1'].append(value) 10 else: 11 my_dict['k2'].append(value) 12 print(my_dict) # defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]})
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict dd = defaultdict(lambda: 'N/A') dd['key1'] = 'abc' print(dd['key1']) # key1存在 print(dd['key2']) # key2不存在,返回默认值
Counter
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
from collections import Counter
c = Counter('abcdeabcdabcaba')
print(c) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
time
时间模块.
表示时间的三种方式:
在Python 中, 通常有这三种方式来表示时间: 时间戳, 元祖(struct_time), 格式化的时间字符串.
- 时间戳(timestamp): 时间戳表示是从 1970年1月1日00:00:00 开始按秒计算的偏移量.运行 type(time.time()) 返回类型是 float. 主要是为了计算机能够识别的时间.
- 格式化的时间字符串(Format String): 人类可以看懂的时间 "2020-04-09 12:22:00"
- 元祖(struct_time): struct_time 元祖共有9 个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等),元祖类型时间主要是用于时间操作的.
常用的命令
import time
time.sleep(2) # 定义指定延迟运行时间,单位秒.
time.strftime("%Y-%m-%d %H:%M:%S") # 获取当前格式化时间 "2020-04-09 12:22:00"
time.time() # 获取当前时间戳
t1 = time.localtime() # 获取元祖类型时间
print('{}-{}-{}'.format(t1.tm_year,t1.tm_mon,t1.tm_mday -1 )) # 可以获取指定指定日期的时间,例如前一天的日期
Format String
格式化符号:
%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 当前时区的名称 %% %号本身
例子:
import time
s1 = time.strftime("%Y-%m-%d %H:%M:%S")
s2 = time.strftime("%Y-%m-%d %X")
print(s1) # 2020-04-09 12:30:15
print(s2) # 2020-04-09 12:30:15
Struct_time
| 索引(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.gmtime(时间戳) \ time.gmtime(时间戳)
print(time.gmtime()) # UTC 时间, 与英国伦敦当地时间一致. print(time.localtime()) # 当地时间与北京时间一致 # time.struct_time(tm_year=2020, tm_mon=4, tm_mday=9, tm_hour=4, tm_min=42, tm_sec=31, tm_wday=3, tm_yday=100, tm_isdst=0) # time.struct_time(tm_year=2020, tm_mon=4, tm_mday=9, tm_hour=12, tm_min=42, tm_sec=31, tm_wday=3, tm_yday=100, tm_isdst=0) print(time.localtime(1500000000)) # 时间戳 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) print(time.mktime(time_tuple)) # 接收字符串 # 1500000000.0
结构化时间 --->> 字符串时间
语法: time.strftime("格式定义","结构化时间")
print(time.strftime("%Y-%m-%d %X",time.localtime(1600000000))) # 2020-09-13 20:26:40
字符串时间 --->> 结构化时间
语法: time.strptime("时间字符串",字符串对应格式)
print(time.strptime('2018-05-05','%Y-%m-%d'))
# time.struct_time(tm_year=2018, tm_mon=5, tm_mday=5, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=125, tm_isdst=-1)

#结构化时间 --> %a %b %d %H:%M:%S %Y串 #time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串 >>>time.asctime(time.localtime(1500000000)) 'Fri Jul 14 10:40:00 2017' >>>time.asctime() 'Mon Jul 24 15:18:33 2017' #时间戳 --> %a %b %d %H:%M:%S %Y串 #time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串 >>>time.ctime() 'Mon Jul 24 15:19:07 2017' >>>time.ctime(1500000000) 'Fri Jul 14 10:40:00 2017'
datetime
os
os模块是与操作系统交互的一个接口。
import os
# 文件目录相关
os.makedirs('dir1/dir2') # 可递归创建多级目录 相当于 mkdir -p
os.mkdir('dir') # 创建单机目录 相当于 mkdir
os.removedirs('dirname') # 若目录为空则删除,并递归上一级目录若也为空则删除,以此类推.
os.rmdir('dirname') # 删除单级空目录,若目录不为空则报错
os.listdir('dirname') # 列出指定目录下面所有文件及目录,包括隐藏文件夹,并以列表方式打印.
os.remove('filename') # 删除指定的文件.
os.rename('oldname','newname') # 重命名文件或者目录.
os.stat('path/filename') # 获取文件或者目录信息.
os.getcwd() # 获取当前工作目录,即shell脚本工作目录.
os.chdir('dirname') # 改变当前工作目录,相当于 cd
# 系统命令 相关
os.system("bash command") # 运行 shell命令 直接显示输出.
os.popen("bash command").read() # 运行 shell 命令,获取执行结果.
os.environ() # 获取系统环境变量
# 路径相关
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, 不存在则返回 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.getctime('path') # 返回 path 的windows环境下是输出文件创建时间;如果是linux环境下ctime代表“状态时间”
os.path.getsize('path') # 返回 path 的大小.
# 进程相关
os.kill(pid, signal.x) # 给指定进程传送信号
os.nice(increment) # 增加increment到进程的nice值,返回一个新的nice值。
# 模块属性
os.sep.join() # 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep() # 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep() # 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name() # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
1 stat 结构: 2 3 st_mode: inode 保护模式 4 st_ino: inode 节点号。 5 st_dev: inode 驻留的设备。 6 st_nlink: inode 的链接数。 7 st_uid: 所有者的用户ID。 8 st_gid: 所有者的组ID。 9 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 10 st_atime: 上次访问的时间。 11 st_mtime: 最后一次修改的时间。 12 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。 13 14 stat 结构
sys
sys模块是与python解释器的一个交互接口。
import sys
sys.argv[*] # 命令行参数List,第一个元素是程序本身路径
sys.exit('n') # 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version # 获取Python解释程序的版本信息
sys.path() # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform() # 返回操作系统平台名称
# 自定义返回状态码
import sys
try:
sys.exit(1)
except SystemExit as e:
print(e)
shutil
高级的文件,文件夹,压缩包处理模块。
# 文件及目录相关
shutil.copyfileobj('fsrc','fdst',length=1024) # 强文件内容拷贝到另外一个文件中,可以使部分内容.
shutil.copyfile(src='src', dst='dst') # 拷贝文件
shutil.copymode(src='src', dst='dst') # 仅仅拷贝权限,内容,组,用户 权限不变
shutil.copystat(src='src', dst='dst') # 拷贝状态的信息.包括 mode bits, atime,mtime,flags
shutil.copy(src='src', dst='dst') # 拷贝文件和权限.
shutil.copy2(src='src', dst='dst') # 拷贝文件和状态信息.
shutil.copytree('source', 'destination', symlinks=True,ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
# 递归拷贝文件 拷贝符号链接文件,指定排除的文件
shutil.rmtree('path',ignore_errors=True,) # 递归删除文件,忽略错误
shutil.move(src='src', dst='dst') # 递归移动文件
psutil
psutil 模块是第三方模块,主要调取主机 CPU, 内存, 网络,磁盘等状态信息.可跨平台运.支持Linux/UNIX/OSX/Windows等。
安装: pip install psutil
# cpu相关
print(psutil.cpu_count()) # 获取逻辑CPU数
print(psutil.cpu_count(logical=False)) # 获取物理cpu数
print(psutil.cpu_times()) # 统计 cpu的用户 / 系统/空闲时间.
# scputimes(user=6423.875, system=9310.203125, idle=171244.734375, interrupt=1091.421875, dpc=1583.828125)
# 再实现类似top命令的CPU使用率,每秒刷新一次,累计10次:
for x in range(10):
print(psutil.cpu_percent( interval=1,percpu=True))
'''
[30.4, 3.1, 9.4, 17.2, 25.0, 7.8, 19.4, 7.8]
[16.7, 6.2, 3.1, 20.0, 10.8, 4.6, 10.4, 4.6]
[28.6, 3.1, 4.7, 7.8, 4.7, 10.9, 23.2, 7.8]
[23.5, 10.6, 16.9, 14.1, 14.1, 20.0, 27.1, 14.1]
[17.6, 6.2, 10.9, 6.2, 18.8, 20.3, 33.3, 14.1]
[24.6, 9.4, 12.3, 6.2, 14.1, 7.8, 23.9, 14.1]
[10.6, 7.8, 14.1, 9.4, 12.5, 3.1, 26.1, 15.4]
[20.3, 6.2, 7.8, 15.6, 14.1, 10.9, 30.1, 12.5]
[27.1, 10.9, 16.9, 23.1, 21.5, 20.0, 29.2, 17.2]
[30.0, 15.6, 18.5, 10.9, 12.5, 10.9, 31.9, 10.9]
'''
# 内存相关
# 返回的是字节为单位的整数,
print(psutil.virtual_memory())
# svmem(total=8427679744, available=1546129408, percent=81.7, used=6881550336, free=1546129408)
print(psutil.swap_memory())
# sswap(total=12601024512, used=11296718848, free=1304305664, percent=89.6, sin=0, sout=0)
# 磁盘相关
# opts中包含rw表示可读写,journaled表示支持日志。
print(psutil.disk_partitions()) # 打印分区信息
print(psutil.disk_usage('/')) # 查看分区使用情况
print(psutil.disk_io_counters() ) # 查看 IO
作者:闫世成
出处:http://cnblogs.com/yanshicheng

浙公网安备 33010602011771号