collection模块: ```python 在字典,列表,元组,集合的基础上,还提供了具名元组,双端队列,计数器,有序字典,默认字典等 1.namedtuple:具名元组,具有名字的元组 from collections import namedtuple eg1: point = namedtuple(‘坐标‘,[‘x‘,‘y‘]) #可以传可迭代对象 也可穿字符串 串间空格隔开 p = point(1,2) #元素个数与 namedtuple的第二个参数中的个数一一对应 print(p.x) print(p.y) eg2: b = namedtuple(‘扑克‘,‘color 大小‘) a = b(‘♠‘,‘K‘) print(a) 2.depue:双端队列 可以高效的实现添加,删除,插入;适用于队列与栈 特点:可以根据索引在任意位置插值,正常队列不能插值 from collections import deque q = deque([‘a‘,‘b‘,‘c‘]) q.append(‘d‘) q.appendleft(‘lii‘) b=q.popleft() print(b) deque除了实现list的append()和pop()外,还支持appendleft()和popleft() 3.OrdereDict:有序字典,平常字典的key是无序的,要让他有序就用有序字典 无序字典:key无序,无法确定key的顺序 >>> from collections import OrderedDict >>> d = dict([(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]) >>> d # dict的Key是无序的 {‘a‘: 1, ‘c‘: 3, ‘b‘: 2} 有序字典:key会根据插入顺序排 >>> od = OrderedDict([(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]) >>> od # OrderedDict的Key是有序的 OrderedDict([(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]) 4.defaultdict:默认字典 有集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中; 老方法: values = [11, 22, 33,44,55,66,77,88,99,90] my_dict = {} for value in values: if value>66: if my_dict.has_key(‘k1‘): my_dict[‘k1‘].append(value) else: my_dict[‘k1‘] = [value] else: if my_dict.has_key(‘k2‘): my_dict[‘k2‘].append(value) else: my_dict[‘k2‘] = [value] 新方法: 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) 5.Counter:计数器,计算个数 老方法: d = {} b=[] c = ‘sdskhgusdfsdfs‘ for i in c: b.append(i) b.count(i) d[i]=b.count(i) print(d) 新方法: from collections import Counter res = ‘sdskhgusdfsdfs‘ print(Counter(res) ``` time模块: ``` 表示时间的三张形式:时间戳,格式化时间(用来展示给人看的),时间结构化 import time 1.time.time() #1500875844.800804 2.time.strftime(‘%Y-%m-%d %H:%M:%S‘) # %X 等价于%H:%M:%S‘ 2019-07-18 20:04:35 3.time.localtime() #(tm_year=2019, tm_mon=7, tm_mday=18, tm_hour=20, tm_min=3, tm_sec=0) 三者间的转化: ``` date time模块 ``` import datetime # 自定义日期 res = datetime.date(2019, 7, 15) print(res) # 2019-07-15 # 获取本地时间 now_date = datetime.date.today() print(now_date) # 2019-07-01 # 年月日时分秒 now_time = datetime.datetime.today() print(now_time) # 2019-07-01 17:46:08.214170 print(now_time.year) # 获取年份2019 print(now_time.month) # 获取月份7 print(now_time.day) # 获取日1 print(now_time.weekday()) # 获取星期(weekday星期是0-6) 0表示周一 print(now_time.isoweekday()) # 获取星期(weekday星期是1-7) 1表示周一 # 获得本地日期 年月日 tday = datetime.date.today() # 定义操作时间 day=7 也就是可以对另一个时间对象加7天或者减少7点 tdelta = datetime.timedelta(days=7) # 打印今天的日期 print(‘今天的日期:{}‘.format(tday)) # 2019-07-01 # 打印七天后的日期 print(‘从今天向后推7天:{}‘.format(tday + tdelta)) # 2019-07-08 ``` random模块 ``` 随机小数:random.random(0,1) (0,1) 随机整数:random.randint(0,9) [0,9] 洗牌: random.shuffle([1,3,5]) [1,5,3],打乱次序 摇号: random.choice([1,3,5]) 随机选择一个返回 应用场景:生成随机验证码 def my(a): h =‘‘ for i in range(a): f =chr(random.randint(97,122)) A =chr(random.randint(65,99)) c = str(random.randint(0,9)) h+=random.choice([f,A,c]) return h print(my(5)) ``` o s 模块:与操作系统大交到 ```python 常用的 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.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.getsize(path) 返回path的大小 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回 os.path.dirname(path) 返回path的目录 os.path.isabs(path) 如果path是绝对路径,返回True 融汇贯通: import os BASE_DIR = os.path.dirname(__file__) MOVIE_DIR = os.path.join(BASE_DIR,‘老师们的作品‘) movie_list = os.listdir(MOVIE_DIR) while True: for i,j in enumerate(movie_list,1): print(i,j) choice = input(‘你想看谁的啊(今日热搜:tank老师)>>>:‘).strip() if choice.isdigit(): # 判断用户输入的是否是纯数字 choice = int(choice) # 传成int类型 if choice in range(1,len(movie_list)+1): # 判断是否在列表元素个数范围内 # 获取用户想要看的文件名 target_file = movie_list[choice-1] # 拼接文件绝对路径 target_path = os.path.join(MOVIE_DIR,target_file) with open(target_path,‘r‘,encoding=‘utf-8‘) as f: print(f.read()) ``` sys模块:与python解释器打交到 ```python sys.path.append() 将某个路径添加到系统的环境变量中 sys.argv 命令行参数List,第一个元素是程序本身路径 eg: if len(sys.argv) <= 1: print(‘请输入用户名和密码‘) else: username = sys.argv[1] password = sys.argv[2] if username == ‘jason‘ and password == ‘123‘: print(‘欢迎使用‘) else: print(‘用户不存在 无法执行当前文件‘) ``` 序列化与反序列化 ``` 序列化:就是把其他类型的数据转化为字符串的过程 反序列化:是把字符串转化成其他的数据类型 序列化的目的:让程序便于维护,让对象持久化,以便于传递到其他地方 dump:序列化到文件中 load:从文件中反序列化出来 存 dumps:序列化 loads:反序列化 取 json模块 所有的语言都支持json格式,都认识它 但其本身支持的数据类型很少 字符串 列表 字典 整型 元组(转成列表) 布尔值 json 格式的字符串必须是双引号的 pickle模块 只支持python的(自己与自己玩) python所有的数据类型都支持 用pickle操作文件的时候 文件的打开模式必须是b模式 注:写入文件的数据必须是字符串,基于网络传输的数据必须是二进制 -------------------------------------------------------------------------------- import json dic = {"name": "王彦飞", "age": "18"} obj = json.dumps(dic,ensure_ascii=False) print(obj) user = json.loads(obj) print(user) with open(‘name‘,‘w‘,encoding=‘utf-8‘)as f: data =json.dump(dic,f) print(data) f = open(‘name‘,‘r‘,encoding=‘utf-8‘) d = json.load(f) print(d) f.close() f = open(‘bb‘,‘w‘,encoding=‘utf-8‘) data = json.dumps(‘hello‘) re = json.dumps(‘what is your name‘) f.write(‘%s\n‘%data) f.write(‘%s\n‘% re) print(data) print(re) f.close() with open(‘bb‘,‘r‘,encoding=‘utf-8‘)as f: for line in f: res = json.loads(line) print(line) -------------------------------------------------------------------------------- import pickle dic = {‘name‘:‘王彦飞‘,‘age‘:‘18‘} b = pickle.dumps(dic) print(b) c = pickle.loads(b) print(c) with open(‘bb‘,‘wb‘) as f: data = pickle.dump(dic,f) with open(‘bb‘,‘rb‘,) as f: b= pickle.load(f) print(b) ``` subprocess模块:子进程 ```python 进程:指的是一个正在运行中的程序 子进程:指的是由另个一进程开启的进程 a在运行过程中 开启了b b就是a的子进程 为什么要开启子进程 当一个程序在运行过程中有一个任务,自己做不了或是不想做 就可以开启另一个进程来帮助其完成任务 例如 qq中收到一个链接 点击链接 就开启了; 浏览器 浏览器就是qq的子进程 -----------------------------------------------------------------------------------------------------eg: import subprocess obj =subprocess.Popen(‘dir‘,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) print(obj.stdout.read().decode(‘gbk‘)) obj = subprocess.Popen(‘help‘,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) print(obj.stdout.read().decode(‘gbk‘)) p1 = subprocess.Popen("tasklist",shell=True,stdout=subprocess.PIPE) p2=subprocess.Popen("findstrQQ",shell=True,stdin=p1.stdout,stdout=subprocess.PIPE,stderr=subprocess.PIPE) print(p2.stdout.read()) print(p2.stderr.read()) ----------------------------------------------------------------------------------------------------- subprocess.Poen(参数1:指令,参数2:是否是一个指令,3 错误输出管道,4 输入管道,5 输出管道) 取出管道中的数据 p.stderr.read() p.stdout.read() 将输入写入管道 交给对方进程 p.stdin.write(p.stdout.read()) ```
原文:https://www.cnblogs.com/wyf20190411-/p/11210048.html