python 之 常用模块(colleections模块、时间模块、os模块、sys模块、shutil模块)
collections模块
在内置数据类型,list、tuple、dict、set的基础上,collections模块提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple、OrderedDict等。
1、Counter:计数器,主要用来计数;
2、deque:双端队列,可以迅速的从另外一侧追加和退出对象;
3、dafaultdict:带有默认值的字典;
4、namedtuple:生成可以使用名字来访问元素内容的tuple;
5、OrderedDict:有序字典。
Counter
Counter类的目的是用来跟踪值得出现次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为Key。其计数作为value。计数值可以是任意的Interger(包括0和负数)。C欧尼特然类和其他语言的bags或者multisets很相似。
import collections c = 'abababababsbjdjdkjh' c_count = collections.Counter(c) print(c_count)
deque
使用list存储数据时,按索引访问元素很快,但是插入和删除元素很慢,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
>>> from collections import deque >>> q = deque(['a','b','c']) >>> q.append('x') >>> q.appendleft('y') >>> q deque(['y', 'a', 'b', 'c', 'x'])
deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
defaultdict
有如下值集合 [
11
,
22
,
33
,
44
,
55
,
66
,
77
,
88
,
99
,
90.
..],将所有大于
66
的值保存至字典的第一个key中,将小于
66
的值保存至第二个key的值中。
即: {
'k1'
: 大于
66
,
'k2'
: 小于
66
}
使用dict
时,如果引用的Key不存在,就会抛出KeyError
。如果希望key不存在时,返回一个默认值,就可以用defaultdict
:
使用defaultdict解决
from collections import defaultdict values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] my_dict = defaultdict(list) for value in values: if value > 66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(my_dict, type(my_dict))
namedtuple
我们知道tuple
可以表示不变集合,例如,一个点的二维坐标就可以表示成:
>>> p = (1, 2)
但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。
这时,namedtuple
就派上了用场:
>>> from collections import namedtuple >>> Point = namedtuple('Point', ['x', 'y']) >>> p = Point(1, 2) >>> p.x >>> p.y
类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple
定义:
#namedtuple('名称', [属性list]): Circle = namedtuple('Circle', ['x', 'y', 'r'])
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']
总结一下:
在这个模块里,我们见识了用来计数的counter,带默认值的字典defaultdict,带顺序的字典OrderedDirt,带名字元素的元组namedtuple,双端队列,可以迅速直接在头尾部操作list的deque
时间模块
time模块
#常用方法 1.time.sleep(secs) (线程)推迟指定的时间运行。单位为秒。 2.time.time() 获取当前时间戳
表示时间的三种方式
时间戳
元组(stuct_time)
格式化的时间字符串
时间戳是计算机系统能够识别的时间、元组则是用来 操作时间的、时间字符串是人能够识别的时间。
1、时间戳获取: time.time(),返回当前时间的时间戳
>>> import time >>> t = time.time() >>> print(t) 1527421831.7811236 # 时间戳,是一个float类型 >>> print(type(t)) <class 'float'>
2、时间字符串: time.strftime("%Y-%m-%d %H-%M-%S"),把一个代表时间的元组或者struct_time(如由time.localtime()或者time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()
>>> s_t = time.strftime('%y-%m-%d %h-%m-%s') #后面的小时、分钟、秒唏嘘是大写 Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> s_t = time.strftime('%y-%m-%d %h-%m-%s') ValueError: Invalid format string >>> s_t = time.strftime('%y-%m-%d %H-%M-%S') #小写的y和大写Y 效果是不一样的 >>> print(s_t) 18-05-27 19-53-59 #时间字符串 >>> s_t = time.strftime('%Y-%m-%d %H-%M-%S') >>> print(s_t) 2018-05-27 19-54-36
3、时间元组:time.localtime(),将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。
>>> l_t = time.localtime() >>> print(l_t) time.struct_time(tm_year=2018, tm_mon=5, tm_mday=27, tm_hour=19, tm_min=57, tm_sec=32, tm_wday=6, tm_yday=147, 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
# 结构化时间-->字符串时间 # time.strftime("格式定义","结构化时间") 结构化时间参数若不传,则是当前时间 >>>time.strftime("%Y-%m-%d %X") '2017-07-24 14:55:36' >>>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)
#结构化时间 --> %a %b %d %H:%M:%S %Y串 #time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串 >>> time.asctime(time.localtime(1500000000)) 'Fri Jul 14 10:40:00 2017' >>> time.asctime() 'Sun May 27 20:36:55 2018' #时间戳 --> %a %d %d %H:%M:%S %Y串 #time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串 >>> time.ctime() 'Sun May 27 20:37:20 2018' >>> time.ctime(1500000000) 'Fri Jul 14 10:40:00 2017'
datetime模块
datetime模块定义了下面这几个类:
- datetime.date:表示日期的类。常用的属性有year, month, day;
- datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond;
- datetime.datetime:表示日期时间。
- datetime.timedelta:表示时间间隔,即两个时间点之间的长度。
- datetime.tzinfo:与时区有关的相关信息。(这里不详细充分讨论该类,感兴趣的童鞋可以参考python手册)
常用的方法
datetime.datetime.now():返回当前的日期类型
>>> datetime.datetime.now()
datetime.datetime(2018, 5, 27, 21, 8, 23, 654172)
datetime.date.fromtimestamp():把一个时间戳转换成datime日期类型,只有年月日,丢了一些东西
>>> datetime.datetime.fromtimestamp(1500000000)
datetime.datetime(2017, 7, 14, 10, 40)
时间运算:datetime.timedelta():里面添加 天 (默认),小时,分钟,秒。比时间戳更容易
>>> datetime.datetime.now()+datetime.timedelta(4)
datetime.datetime(2018, 5, 31, 21, 11, 30, 628930)
时间替换:replace(year=,month=,每个参数都可以换)
>>> datetime.datetime.now().replace(year=2018+5)
datetime.datetime(2023, 5, 27, 21, 13, 22, 446136)
random模块
random模块主要功能
通过random模块可以很容易生成随机字符串
random.randint(1,100) 随机整数包括100
random.randrange(1,100,2) 随机整数不包括100的奇数
random.random() 随机浮点数
random.choice(‘asdgj546’) 返回指定集合中的随机字符
random.sample(‘sadfas’,3) 返回指定集合的多个值
random.shuffle(d) 将打乱原本的数据
import random # 大于等于1小于等于10的整数 res = random.randint(1, 10) print(res) # 大于等于1小于10的整数 res2 = random.randrange(1, 10) print(res2) # 大于0小于1的浮点数 res3 = random.random() print(res3) # 随机返回一个给定集合中的元素 res4 = random.choice('123asf*&') print(res4) res5 = random.choice([1, '23', [5, 6]]) print(res5) # 返回集合中的指定个数的元素 res6 = random.sample('123asf*&', 3) print(res6) # 打乱数据,或者叫洗牌 data = [1, 2, 3, 4, 5, 6] res_data = random.shuffle(data) print(res_data) # 本身没有返回值 print(data) # 将原数据打乱
生成五位验证码,包括数字,字母,符号
import string # 数字,字母等的集合模块 s = string.ascii_lowercase + string.digits + string.punctuation auth_code = random.sample(s, 5) print(auth_code)
os模块
''' os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') 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.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' os.system("bash command") 运行shell命令,直接显示 os.popen("bash command).read() 运行shell命令,获取执行结果 os.environ 获取系统环境变量 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的大小 '''
sys模块
""" sys.argv 命令行参数list,第一个元素是程序本身路径 sys.exit 退出程序,正常退出时exit(0) sys.version 获取python解释程序的版本信息 sys.maxint 最大的int值 python3 是sys.maxsize sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 sys.stdout.write('please:') 标准输出,引出进度条的例子,注意:在python3上不行,可以用print代替 val = sys.stdin.readline()[:-1] 标准输入 sys.getrecursionlimit() 获取最大递归层数 sys.setrecursionlimit() 设置最大递归层数 sys.getdefaultencoding 获取解释器默认编码 sys.getfilesystemencoding 获取内存数据存到文件里的默认编码 """
shutil模块
高级的 文件、文件夹、压缩包 处理模块
shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中,可以指定长度
import shutil shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
shutil.copyfile(src, dst)拷贝文件
shutil.copyfile('f1.log', 'f2.log') # 目标文件无需存在
shutil.copymode(src, dst)仅拷贝权限。内容、组、用户均不变
shutil.copymode('f1.log', 'f2.log') # 目标文件必须存在
shutil.copystat(src, dst)仅拷贝状态的信息,包括:mode bits, atime, mtime, flags
shutil.copystat('f1.log', 'f2.log') # 目标文件必须存在
shutil.copy(src, dst)拷贝文件和权限
shutil.copy('f1.log', 'f2.log')
shutil.copy2(src, dst)拷贝文件和状态信息
shutil.copy2('f1.log', 'f2.log')
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)递归的去拷贝文件
例如:copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
shutil.rmtree(path[, ignore_errors[, onerror]])递归的去删除文件
shutil.rmtree('folder1')
shutil.move(src, dst)递归的去移动文件
shutil.move('folder1', 'folder3')
shutil.make_archive(base_name, format,...)创建压缩包并返回文件路径,例如:zip、tar
- base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
如:www =>保存至当前路径
如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/- format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
- root_dir: 要压缩的文件夹路径(默认当前目录)
- owner: 用户,默认当前用户
- group: 组,默认当前组
- logger: 用于记录日志,通常是logging.Logger对象
import shutil # 将 /Users/wupeiqi/Downloads/test 下的文件打包放置当前程序目录 ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test') # 将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录 ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:
zipfile 压缩解压
import zipfile # 压缩 z = zipfile.ZipFile('laxi.zip', 'w') z.write('a.log') z.write('data.data') z.close() # 解压 z = zipfile.ZipFile('laxi.zip', 'r') z.extractall() z.close()
tarfile 压缩解压
import tarfile # 压缩 tar = tarfile.open('your.tar','w') tar.add('/Users/wupeiqi/PycharmProjects/bbs2.zip', arcname='bbs2.zip') tar.add('/Users/wupeiqi/PycharmProjects/cmdb.zip', arcname='cmdb.zip') tar.close() # 解压 tar = tarfile.open('your.tar','r') tar.extractall() # 可设置解压地址 tar.close()
shutil主要功能总结:
copy文件,目录,带权限等信息
删除目录
归档,压缩
移动