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)# 时间元组,结构化时间

M(D4JW3ARJ`E(Y3$N}_~DW3

时间格式之间的转换

3H4BHL3R[`$(B{[58ZY$R$P

# 时间戳-->结构化时间
# 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)


RX8JAJQJVYI{K3BO%Z5%FNI


#结构化时间 --> %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.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文件,目录,带权限等信息
删除目录
归档,压缩
移动













posted @ 2018-05-27 23:01  游小刀  阅读(502)  评论(0编辑  收藏  举报
levels of contents