一. collections模块
collections模块提供了几个额外的数据类型:namedtuple、deque、Counter、OrderedDict和defaultdict等
1.namedtuple:具名元组
from collections import namedtuple point = namedtuple("point","x y z") # 第二个参数也可以是字符串,字符串之间以空格隔开 point = namedtuple("point", ['x','y','z']) # 第二个参数可以是可迭代对象 p = point(1,2,3) # 元素的个数必须和第二个参数里的数量一样 print(p) print(p.x ,p.y ,p.z) card = namedtuple("扑克牌", "color number") A= card("♠", 'K') print(A) print(A.color,A.number)
2.deque模块:双端队列
队列是先进先出(FIFO:first in first out)
queue队列:
import queue q = queue.Queue() # 生成队列 q.put('first') # 向队列添加元素 q.put("second") q.put("third") print(q.get())# 获取队列元素 print(q.get()) print(q.get())# 队列元素为空,程序会原地等待,直到拿到值为止
deque 双端队列:
from collections import deque q = deque ("abc") # deque括号内的应该是个可迭代对象,会自动把字符串转换成列表 q.appendleft("zxc") # 左添加 q.append("ppp") # 右边添加 q.insert(2,"666") # 特殊点:双端队列可以根据索引在任意位置插值 print(q.pop()) # 右边取出 print(q.popleft()) #左边取出 print(q.popleft()) print(q.popleft())
3.OrderedDict :有序字典
OrderedDict
的Key会按照插入的顺序排列,不是Key本身排序:
from collections import OrderedDict order_d = OrderedDict([('a',1),('b',2),('c',3)]) # 生成一个有序字典并赋值 order_d1 = OrderedDict() # 生成有序字典 order_d1['x'] = 1 # 按key赋值 order_d1['y'] = 2 order_d1['z'] = 3 for i in order_d1: print(i)
4. deafultdict:
defaultdict的作用:在于当字典里的key不存在但被查找时,返回的是一个默认值
from collections import defaultdict values = [11, 22, 33,44,55,66,77,88,99,90] my_dict = defaultdict(list) # 后续该字典中新建的key对应的value默认就是列表 print(my_dict['aaa']) # 当key键不存在时,会自动创建,并且值为空,不会报错 for value in values: if value>66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(my_dict) my_dict1 = defaultdict(int) # 括号里是value的类型,默认为空 print(my_dict1['xxx']) my_dict2 = defaultdict(bool)# 括号里是value的类型,默认为空 print(my_dict2['kkk']) my_dict3 = defaultdict(tuple) # 括号里是value的类型,默认为空 print(my_dict3['mmm'])
5.Counter
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。
from collections import Counter s = 'abcqwerqrdeabcdabcaba' print(Counter(s))
二.时间模块
1.time模块
三种表现形式
1.时间戳
2.格式化时间
3.结构化时间
时间戳
import time print(time.time()) 时间戳,从1970年1月1日0时0分开始计算秒数
格式化时间
import time 查看当前时间 print(time.strftime('%Y-%m-%d %H:%M:%S')) print(time.strftime('%Y-%m-%d %X')) #%X等价于%H:%M:%S
结构化时间
import time print(time.localtime())
几种格式之间的转换
2.datatime模块
import datetime print(datetime.date.today()) # 查看当前时间,年月日 print(datetime.datetime.today()) #查看当前时间,年月日时分秒 print(datetime.datetime.now()) #查看当前时间,年月日时分秒 res = datetime.datetime.today() print(res.year) #查看哪一年 print(res.month) #查看哪个月份 print(res.day) #查看哪一天 print(res.weekday()) #查看周几,0-6表示星期,0表示周一 print(res.isoweekday()) #查看周几,1-7表示星期, 1表示周一
# timedelta对象 = 日期对象 +/- 日期对象 current_time = datetime.date.today() # 日期对象 timetel_t = datetime.timedelta(days=7) # timedelta对象 res1 = current_time+timetel_t # 日期对象
三.random模块:随机
import random print(random.randint(1,6)) # 随机取一个你提供的整数范围内的数字 包含首尾 print(random.random()) # 随机取0-1之间小数 print(random.choice([1,2,3,4,5,6])) # 摇号 随机从列表中取一个元素 res = [1,2,3,4,5,6] random.shuffle(res) # 洗牌 print(res)
示例:随机生成一个验证码
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(4) print(res)
四.os模块
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的大小
五.sys模块
sys模块是与python解释器交互的一个接口
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称
sys.argv命令行运行
import sys print(sys.argv) # 命令行启动文件 后面加参数,可以做身份的验证 if len(sys.argv) <= 1: print('请输入用户名和密码') else: username = sys.argv[1] password = sys.argv[2] if username == 'jason' and password == '123': print('欢迎使用') # 当前这个py文件逻辑代码 else: print('用户不存在 无法执行当前文件')
六.序列化模块
json、pickle模块:序列化模块
序列:字符串
序列化:其他数据类型转换成字符串的过程
反序列化:字符串转成其他数据类型
写入文件的数据必须是字符串,基于网络传输的数据必须是二进制
json和pickle模块的用法相同,使用范围不同。
json模块
所有的语言都支持,适合跨语言
支持的数据类型很少(字符串、列表、字典、整形、元组(转成列表)、布尔值)
pickle模块
只支持python语言
python所有的数据类型都支持
json模块:
dumps: 序列化 将其他数据类型转成json格式的字符串
loads: 反序列化 将json格式的字符串转换成其他数据类型
dump load
dumps 和loads的使用
import json d = {"name":"jason"} print(d) res = json.dumps(d) # json格式的字符串 必须是双引号 >>>: '{"name": "jason"}' print(res,type(res)) res1 = json.loads(res) print(res1,type(res1))
dump 和load的使用
import json d = {"name":"jason"} with open('userinfo','w',encoding='utf-8') as f: json.dump(d,f) # 装字符串并自动写入文件 with open('userinfo','r',encoding='utf-8') as f: res = json.load(f) print(res,type(res))
load不能一次处理多个反序列化
import json with open('userinfo','w',encoding='utf-8') as f: json.dump(d,f) # 装字符串并自动写入文件 json.dump(d,f) # 装字符串并自动写入文件 with open('userinfo','r',encoding='utf-8') as f: res1 = json.load(f) # 不能够多次反序列化 res2 = json.load(f) print(res1,type(res1)) print(res2,type(res2))
处理多个反序列化文件
import json d = { "name" : "jason" } with open('userinfo','w',encoding='utf-8') as f: json_str = json.dumps(d) json_str1 = json.dumps(d) f.write('%s '%json_str) f.write('%s '%json_str1) with open('userinfo','r',encoding='utf-8') as f: for line in f: res = json.loads(line) print(res,type(res))
序列化会把元组转换成列表
import json t = (1,2,3,4) print(json.dumps(t))
dumps序列化会默认把中文转成u的16进制,可以通过ensure_ascii取消转换
import json d1 = {'name':'朱志坚'} print(json.dumps(d1,ensure_ascii=False))
pickle模块:使用pickle模块做文件操作的时候,必须使用b模式
dumps 和loads的使用:
import pickle d = {'name':'jason'} res = pickle.dumps(d) # 将对象直接转成二进制 print(pickle.dumps(d)) res1 = pickle.loads(res) print(res1,type(res1))
dump 和load的使用:
import 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'))