collection,random,os,sys,序列化模块
一.collection 模块
python拥有一些内置的数据类型,比如 str,list.tuple.dict.set等
collection模块在这些内置的数据类型的基础上,提供了额外的数据类型:
- namedtuple 具名元组 :
- 生成可以使用名字来访问元素内容的元组
- deque 双端队列:
- 可以快速的从另外一侧追加和退出对象
- Counter 计数器:
- 主要用来计数
OrderedDict 有序字典:
- 按照键值对插入的顺序排序,不是key本身的顺序
- defaultdict 带有默认值的字典
-
当我使用普通的字典时,用法一般是dict={},添加元素的只需要
dict[key] =value,调用的时候也是如此,dict[key],
但前提是key在字典里,如果不在字典里就会报错
这时defaultdict就能排上用场了,defaultdict的作用是在于,
当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值,
defaultdict可以跟参数,参数可以是list、set、str,boor等等,
作用是当key不存在时,返回的是参数的默认值,
比如:
list对应[ ],
str对应的是空字符串,
set对应set( ),
int对应0
boor对应False
-
1.namedtuple
# 想表示坐标点 x = 1, y = 2 的坐标 point # 普通元组表示 point = (1,2) print(point) # >>> (1,2) 无法辨别这是一个坐标点 """namedtuple 方法可以给元组命名""" from collections import namedtuple point = namedtuple('坐标',['x','y','z']) # 第二个参数可以是可迭代带对象 # point = namedtuple('坐标','x y z') # 第二个参数也可以是字符串,但字符串之间要用空格隔开 p = point(5,2,1) # 注意: 传入的实参必须以定义是需要的参数个数相同 print(p) # >>> 坐标(x=5, y=2, z=1) # print(point(5,2,1)) print(p.x) # >>> 5 print(p.y) # >>> 2 print(p.z) # >>> 1 # 可以单独打印出 传入是实参 # 例 定义扑克牌花色和大小 card = namedtuple('扑克牌','color number') # card = namedtuple('扑克牌',['color','number']) A = card('黑桃','A') print(A) # >>> 扑克牌(color='黑桃', number='A') print(A.color) # >>> 黑 print(A.number) # >>> A
2.deque
import queue q = queue.Queue() # 生成队列对象 # put()方法 向队列中添加值,先加入的在前面 # get()方法 从队列中取值,从第一个开始取 q.put('one') q.put('two') q.put('three') print(q.get()) # >>> one print(q.get()) # >>> two print(q.get()) # >>> three print(q.get()) # 如果值取完了,程序会在原地等待,直到拿到值 '''双端队列''' from collections import deque q = deque(['w','a','l']) # wo = deque(('w','a','l')) ''' append 在尾部添加 appendlift 在头部添加 pop 从尾部弹出 poplift 从头部弹出 ''' q.append(1) q.appendleft(9) print(q) # >>> deque([9, 'w', 'a', 'l', 1]) print(q.pop()) # >>> 1 print(q.popleft()) # >>> 9 print(q) # deque(['w', 'a', 'l'])
3.OrderedDict
d = dict([('a',1),('b',2),('c',3)]) print(d) # 字典的key是无序的 # print({i for i in d}) '''OrderedDict有序字典''' from collections import OrderedDict oredr_d = OrderedDict([('a',1),('b',2),('c',3)]) print(oredr_d) # >>> OrderedDict([('a', 1), ('b', 2), ('c', 3)]) order = OrderedDict() order['x'] = 1 order['z'] = 2 order['y'] = 3 print(order) # >>> OrderedDict([('x', 1), ('z', 2), ('y', 3)]) # print({i for i in order}) # >>> {'z', 'x', 'y'} for i in order: print(i) # 按key在字典中的顺序取出
4.defaultdict
from collections import defaultdict values = [11, 22, 33,44,55,66,77,88,99,90] d = defaultdict(list) # 默认后续字典中key对应的value是列表 for i in values: if i > 66: d['key1'].append(i) else: d['key2'].append(i) print(d) # defaultdict(<class 'list'>, {'key2': [11, 22, 33, 44, 55, 66], 'key1': [77, 88, 99, 90]}) my_dict1 = defaultdict(int) print(my_dict1['xxx']) print(my_dict1['yyy']) # 值不存在 返回 int 的默认值 0 my_dict2 = defaultdict(bool) print(my_dict2['kkk']) # 值不存在 返回 bool 的默认值 False my_dict3 = defaultdict(tuple) print(my_dict3['mmm']) # 值不存在 返回 tuple 对应的默认值 () 空元组 my_dict4 = defaultdict(list) print(my_dict3['www']) # 值不存在 返回 list 对应的默认值 [] 空列表
5.Counter
# 统计: colors = ['red', 'blue', 'red', 'green', 'blue', 'blue'] result = {} for color in colors: if result.get(color)==None: result[color]=1 else: result[color]+=1 print (result) # >>> {'red': 2, 'blue': 3, 'green': 1} from collections import Counter colors = ['red', 'blue', 'red', 'green', 'blue', 'blue'] c = Counter(colors) print(c) # >>> Counter({'blue': 3, 'red': 2, 'green': 1}) print (dict(c)) # >>> {'red': 2, 'blue': 3, 'green': 1}
二.时间模块
- import time
- time.time() 用于返回当前时间的时间戳(从1970年1月1日00时00分00秒到现在的浮点秒数)
- time.sleep(n) 让程序睡眠 n 秒
- time.strftime() 时间样式
- time.localtime() 格式化时间戳为本地时间
- import datetime
- datetime.date.tody() 当前年月日
- datetime.datetime.today() 当前年月日时分秒
(******)
日期对象 = 日期对象 +/- timedelta对象
timedelta对象 = 日期对象 +/- 日期对象
print(time.strftime('%Y-%m-%d')) print(time.strftime('%Y-%m-%d %H:%M:%S')) print(time.strftime('%Y-%m-%d %X')) # %X等价于%H:%M:%S print(time.strftime('%H:%M')) print(time.strftime('%Y/%m')) print(time.localtime()) print(time.localtime(time.time())) res = time.localtime(time.time()) # print(time.time()) print(time.mktime(res)) print(time.strftime('%Y-%m',time.localtime())) print(time.strptime(time.strftime('%Y-%m',time.localtime()),'%Y-%m'))
print(datetime.date.today()) # date>>>:年月日 print(datetime.datetime.today()) # datetime>>>:年月日 时分秒 res = datetime.date.today() res1 = datetime.datetime.today() print(res.year) print(res.month) print(res.day) print(res.weekday()) # 0-6表示星期 0表示周一 print(res.isoweekday()) # 1-7表示星期 7就是周日
current_time = datetime.date.today() # 日期对象 timetel_t = datetime.timedelta(days=7) # timedelta对象 res1 = current_time+timetel_t # 日期对象 print(current_time - timetel_t) print(res1-current_time) # 小练习 计算今天距离今年过生日还有多少天 birth = datetime.datetime(2019,12,21,8,8,8) current_time = datetime.datetime.today() print(birth-current_time) # UTC时间 dt_today = datetime.datetime.today() dt_now = datetime.datetime.now() dt_utcnow = datetime.datetime.utcnow() print(dt_utcnow,dt_now,dt_today)
三.random随机模块
random.random()
随机 0-1 之间的小数
random.randint()
随机整数
random.choice()
随机从可迭代对象中去一个数
random.shuffle()
洗牌,打乱
print(random.random()) # 随机 0-1 之间的小数 print(random.randint(1,7)) # 随机 1-7 之间的整数,包含收尾 print(random.choice([1,2,3,4,5])) # 随机从列表中取一个数 print(random.choice((1,2,3,5,6,7))) # choice 的参数 需是可迭代对象 res = [1,5,2,7,9,6] random.shuffle(res) # 洗牌,打乱 print(res) up_res = chr(random.randint(65,90)) # 按ASCII码表随机取一个大写字母 print(up_res) low_res = chr(random.randint(97,122)) # 按ASCII码表随机取一个小写字母 print(low_res)
# 生成随机验证码 """ 大写字母 小写字母 数字 5位数的随机验证码 chr random.choice 封装成一个函数,用户想生成几位就生成几位 """ def get_code(n): code = '' for i in range(n): # 先生成随机的大写字母 小写字母 数字 upper_str = chr(random.randint(65,90)) lower_str = chr(random.randint(97,122)) random_int = str(random.randint(0,9)) # 从上面三个中随机选择一个作为随机验证码的某一位 code += random.choice([upper_str,lower_str,random_int]) return code res = get_code(5) print(res)
四 os模块
os模块是与操作系统打交道
1 os.listdir()
以列表的形式返回所指定文件下的所有文件夹和文件
print(os.listdir(r'D:\python视频\day16\代码\day16\老师们的作品')) # >>> ['tank老师.txt', '冲老师.txt', '明老师.txt', '波老师.txt', '田老师.txt', '苍老师.txt']
2 os.path.dirname(__file__)
获取当前所在py文件的文件夹路径(绝对路径)
BASE_DIR = os.path.dirname(__file__) print(BASE_DIR) # >>> D:/python视频/day16/代码/day16
3 os.path.join()
拼接绝对路径
join_dir = os.path.join(BASE_DIR,'老师们的作品') print(join_dir) # >>> D:/python视频/day16/代码/day16\老师们的作品
4 os.mkdir()
自动创建文件夹(在当前py文件的文件夹下创建)
5 os.path.exists()
判断文件或文件夹 是否在指定的路径下
print(os.path.exists(r'D:\python脱产10期视频\day16\代码\day16\老师们的作品')) # >>> True print(os.path.exists(r'D:\python脱产10期视频\day16\代码\day16\老师们的作品\tank老师.txt')) # >>> True
6 os.path.isfile()
只判断文件夹 是否在指定的路径下
print(os.path.isfile(r'D:\python脱产10期视频\day16\代码\day16\老师们的作品')) # >>> False print(os.path.isfile(r'D:\python脱产10期视频\day16\代码\day16\老师们的作品\tank老师.txt')) # >>> True
7 os.path.rmdir()
删除指定路径的文件夹 只删除空文件
os.rmdir(r'D:\Python项目\day16\老师们的作品') # 只能删空文件夹
8 os.getcwd()
打印当前py文件所在的文件夹路径,与 dirname 相同
print(os.getcwd())# 打印当前py文件所在的文件夹路径 # >>> D:\python脱产10期视频\day16\代码\day16
9 os.chdir()
切换到指定的文件夹路径
print(os.chdir(r'D:\python脱产10期视频\day16\代码\day16\老师们的作品')) # 切换到指定的文件夹路径 print(os.getcwd()) # 与 chdir 和用,打印出所切换到的文件夹路径 # >>> D:\python视频\day16\代码\day16\老师们的作品
10 os.path.getsize()
获取文件大小(字节数)
print(os.path.getsize(r'D:\python脱产10期视频\day16\代码\day16\老师们的作品\tank老师.txt')) # 字节大小(个数) with open(r'D:\python脱产10期视频\day16\代码\day16\老师们的作品\tank老师.txt',encoding='utf-8') as f: print(len(f.read())) # 字符个数
五.sys模块
sys模块是与python解释器打交道
1 sys.path.append()
将某个路径添加到系统环境变量中
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) # print(BASE_DIR) sys.path.append(BASE_DIR)
2 sys.platform
电脑的系统配置
3 sys.version
python 解释器版本
4 sys.argv
获取当前py文件的绝对路径,且以list形式返回
print(sys.argv) # 命令行启动文件 可以做身份的验证 # ['D:/python脱产10期视频/day16/代码/day16/06 sys模块.py']
六.序列化模块
序列化:其他数据类型转成字符串的过程
反序列化:字符串转成其他数据类型
写入文件的数据必须是字符串,基于网络传输必须是二进制
1 json模块
只支持的数据类型:
字符串 列表 字典 整形 元组(转成列表) 布尔值
优点:所有的语言都支持json格式
缺点:支持的数据类型很少
dumps:序列化 将其他数据类型转成json格式的字符串
loads:反序列化 将json格式的字符串转换成其他数据类型
res = json.dumps(d) # json格式的字符串 必须是双引号 >>>: '{"name": "jason"}' print(res,type(res)) # >>> {"name": "jason"} <class 'str'> res1 = json.loads(res) # 将 json 字符串格式的字典转成 字典 print(res1,type(res1)) # >>> {'name': 'jason'} <class 'dict'>
dump 针对文件操作 把字典转成json字符串并写入到文件
load 针对文件操作 把文件中以json字符串形式存的内容反序列化读出来
d = {"name":"json"} # 字典 with open('userinfo','w',encoding='utf-8') as f: json.dump(d,f) # 转字符串形式的字典并自动写入文件 {"name": "json"} <class 'str'> with open('userinfo','r',encoding='utf-8') as f: res = json.load(f) # {'name': 'json'}<class 'dict'> print(res,type(res))
2 pickle模块
缺点:只支持python
优点:python的所有的数据类型都支持
dumps 将数据序列化成二进制格式 ()可解码符内容)
loads 反序列化
d = {'name':'json'} res = pickle.dumps(d) # 将对象直接转成二进制 print(pickle.dumps(d)) res1 = pickle.loads(res) print(res1,type(res1))
dump 针对文件操作 把数据序列化成二进制并写入到文件
load 针对文件操作 把文件中以pickle形式存的二进制内容反序列化读出来
用pickle操作文件的时候 文件的打开模式必须是b模式
with open('userinfo_1','wb') as f: pickle.dump(d,f) with open('userinfo_1','rb') as f: res = pickle.load(f) print(res,type(res))
七.subprocess子进程
1.用户通过网络连接上了你的这台电脑
2.用户输入相应的命令 基于网络发送给了你这台电脑上某个程序
3.获取用户命令 里面subprocess执行该用户命令
4.将执行结果再基于网络发送给用户
这样就实现 用户远程操作你这台电脑的操作
while True: cmd = input('cmd>>>:').strip() import subprocess obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) # print(obj) print('正确命令返回的结果stdout',obj.stdout.read().decode('gbk')) print('错误命令返回的提示信息stderr',obj.stderr.read().decode('gbk'))