常用模块讲解

  • collections模块

  • time模块

  • random产生随机数的模块

  • os模块和sys模块

  • 序列化模块son和pickle

一、collections模块
1、namedtuple模块
from collections import namedtuple


point = namedtuple("坐标",["x","y","z"]) # 第二个参数必须是可迭代对象,且可迭代对象内部的元素必须是字符串
point = namedtuple("坐标","x y z") # 第二个参数也可以是个字符串,字符串内的每个字符必须用空格或者逗号隔开
p = point(1,2,3) # 传的参数的个数有可迭代对象内部的字符串元素的个数或者字符串的字符的分割个数一致
print(p.x) # 具名元组中的每个元素可以通过具名元组直接调用每个元素的名字得到每个元素对应的值
# 扑克牌
cards = namedtuple("扑克牌",["color", "number"])
c = cards("♥", 2)
c1 = cards("♠", 9)
print(c)
print(c1)
print(c.number)
2、队列(FIFO)

普通队列

# queue
import queue
q = queue.Queue()  # 生成队列对象
q.put("first")  # put往队列里放元素
q.put("second")
q.put("third")
print(q.get())  # 队列中取值用get  队列的元素先进先出  first
print(q.get())  # second
print(q.get())  # third
print(q.get())  # 当队列的元素被取完时,会等待队列继续添加元素,让后在继续输出,程序不会停止

双端队列

# 双端队列:可以从队列的两头分别放值和取值
q = deque((1,2,3,4,5))  # 双端队列通过调用collections模块中的deque实现的,deque中放入可迭代的数据类型即可
print(q.pop())  # 双端队列可以用pop从队列的后端弹出的数据,弹出的数据作为返回值可以被接收
print(q.pop())
print(q.pop())
print(q.pop())
print(q.pop())
print(q.pop())  # 当双端队列中没有数据的时候,继续执行pop会报错

print(q.popleft())  # 双端队列可以利用popleft从队列的前端弹出数据
print(q.popleft())
print(q.popleft())
print(q.popleft())
print(q.popleft())
print(q.popleft())# 当双端队列中没有数据的时候,继续执行popleft会报错

# 双端队列可以使用append从队列的后端添加元素
q.append("c")
print(q)  # deque([1, 2, 3, 4, 5, 'c'])
q.append("e")
print(q)  # deque([1, 2, 3, 4, 5, 'c', 'e'])

# 双端队列也可以使用appendleft从队列的前端添加数据
q.appendleft("c")
print(q)  # deque(['c', 1, 2, 3, 4, 5])
q.appendleft("e")
print(q)  # deque(['e', 'c', 1, 2, 3, 4, 5])

# 双端队列也可以使用insert在队列任位置插入元素
q.insert(2, "777")
print(q)  # deque([1, 2, '777', 3, 4, 5])
3、有序字典
# 按照字典中元素的存储顺序取出字典中的键值对
from collections import OrderedDict
order_d = OrderedDict((("name","jason"),("age",18),("gender","不详")))
print(order_d)
4、默认值字典defaultdict

defaultdict与字典dict.fromkeys一样都是给键赋值,但是不同的是,defaultict可以赋给每个key不同的值,但value的类型是确定且一样的
dict.fromkeys是批量给键赋值,每个键对应的值相同,且改一个其他的同样更改,更改后的值还是一样的

from collections import defaultdict
dic = defaultdict(list)
值的数据类型时可迭代类型时(除字符串)
print(dic["k1"])  # [] 当键不存在是会添加键,对用的值为对应数据类型的空,添加值时按照对应数据类型的操作添加值
print(dic)  # defaultdict(<class 'list'>, {'k1': []})
dic["k1"].append("b")  # 当健值对存在时找到对应的键的值添加数据即可
print(dic)
defaultdict(<class 'list'>, {'k1': ['b']})
当值的数据类型时不可迭代类型时(比如整形)
dic1 = defaultdict(int)
print(dic1["k1"])  # 0    # 当键不存在是会添加键,对用的值为对应数据类型的空,添加的值会直接覆盖0
print(dic1)  # defaultdict(<class 'int'>, {'k1': 0})
dic1["k1"] = 1
print(dic1)  # 当键值存在时找到对应的键的值直接覆盖
defaultdict(<class 'int'>, {'k1': 1})
6、Counter模块

用来对字符串中字符出现的次数进行计数,并以字典的形式返回,健值对的形式为(字符:次数)

s="sadiojiowh13213h123o"
from collections import Counter
res = Counter(s)
print(res)
二、时间模块

在时间模块中,时间的表现形式有三种,分别是时间戳、格式化时间(用来展示给人看的)、结构化时间。

python中时间日期格式化符号:

%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 当前时区的名称
%% %号本身
1、time模块
import time
res1 = time.time()  # 1563445281.0066159 单位是秒
res2 = time.strftime("%Y-%m-%d %x")  # 2019-07-18 07/18/19
res3 = time.localtime()  # time.struct_time(tm_year=2019, tm_mon=7, tm_mday=18, tm_hour=18, tm_min=21, tm_sec=21, tm_wday=3, tm_yday=199, tm_isdst=0)
print(res1,res2,res3)  # 分别为时间戳、格式化时间、结构化时间

三种时间格式之间也可以相互转换

时间格式转换

# 时间戳与结构化时间
res1 = time.time()
res1时间戳转换成格式化时间
res2 = time.localtime(res1)
res2结构化时间
res3 = time.mktime(res2)
print(res1,res2,res3)
# 格式化时间与结构化时间的相互转换
# 在转换过程中,要保证两者显示的时间的对应位置关系一致
res1 = time.strftime("%Y-%m-%d %H:%M:%S")
res1格式化时间转换成结构化时间
res2 = time.strptime(res1,"%Y-%m-%d %H:%M:%S")
res2转换成格式化时间
res3 = time.strftime("%Y-%m-%d %H:%M:%S",res2)
print(res1,res2,res3)

2、datatime模块
import datetime
res1 = datetime.datetime.today() # 年月日时分秒
res2 = datetime.date.today()  # 年月日
print(res1)  # 年月日 时分秒
print(res2)  # 年月日
print(res1.year)  # 年
print(res1.month)  # 月
print(res1.day)  # 日
print(res1.hour)  # 时
print(res1.minute)  # 分
print(res1.second)  # 秒
print(res1.weekday())  # 0-6表示星期 0表示星期一 6表示星期天
print(res1.isoweekday())  # 1-7表示星期 1表示星期一 7表示星期天

日期对象可以进行加减,也就是两个日期相隔的天数
current_time = datetime.date.today()  # 日期对象
time_d = datetime.timedelta(days=10)  # 间隔天数
new_time = current_time + time_d  # 新的日期对象
print(new_time)


UTC时间
time_u = datetime.datetime.utcnow()
print(time_u)  # 世界时间

三、产生随机数模块random

import random
print(random.random())  # 0-1的随机小数
print(random.randint(1,10))  # 1-10的随机整数
print(random.choice([1,23,4,5,6,7,3]))  # 随机选取一个元素
res = [1,23,4,5,6]
ret = random.shuffle(res)
print(res)  # 打乱数据原有的顺序
四、os模块和sys模块

os模块的功能主要与操作系统有关,sys模块的功能主要与python解释器有关
几个使用频率较高的os模块的方法

import os, sys

__file__  # 表示当前文件的路径

os.path.dirname() # 返回当前路径的上一级路径
os.path.join()  # 路径的拼接
os.listdir()  # 以列表的形式返回当前路径下的所有文件名

print(os.path.exists("老师们的作品"))  # 判断文件或文件夹是否存在
os.path.isfile()  # 只能判断文件是否存在
os.mkdir(r"D:\10期\day16\老师们的作品\老师们的集合")  # 若文件夹不存在,就自动创建

os.rmdir()  # 只能删除空的文件夹

os.getcwd() # 取得当前文件的路径

os.path.getsize()  # 判断文件的大小,返回的时文件内容的字节数
sys.path.append()  # 将某个路径添加到系统的环境变量中
print(sys.platform)  #  显示操作系统的版本
print(sys.version)  # 显示python解释器的版本
print(sys.argv)  # 命令行启动文件 可以做身份的验证

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.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的大小
五、序列化模块

每种编程语言间的数据类型不是全部互通的,通用的有字符串类型的数据
为了解决语言互通的问题,使用序列化模块将A语言的数据转化为字符串,B语言拿到字符串的数据通过序列化模块反序列化为自己的数据类型
json模块可以在所有语言中使用
pickle模块只能在python语言中使用

import json,pickle
json.dumps()  # 将拿到的数据序列化成字符串
pickle.dumps()  # 将拿到的数据序列化成字符串
json.loads()  # 将拿到的数据反序列化成自己的数据类型的数据
pickle.loads()  # 将拿到的数据反序列化成自己的数据类型的数据

json.dump()  # 将拿到的数据序列化成字符串,然后存到文件中
pickle.dump()  # 将拿到的数据序列化成字符串,然后存到文件中
json.load()  # 从文件中拿到字符串数据,反序列化成自己的数据类型,需要注意拿到的数据是被序列化的
pickle.load()  # 从文件中拿到字符串数据,反序列化成自己的数据类型,需要注意拿到的数据是被序列化的

序列化的数据以某种存储形式使自定义对象持久化,将对象从一个地方传递到另一个地方,使程序更具维护性。

posted on 2019-07-18 20:43  so_interesting  阅读(112)  评论(0编辑  收藏  举报

导航