Day 16 常用模块
1.collections模块:额外数据类型模块
1:namedtuple(具名元组):有名字的元组,通常用于坐标系,扑克牌
from collections import namedtuple point = namedtuple('坐标',['x','y','z']) # 第一个参数就是名字,第二个可以传可迭代对象,也可以传字符串,字符串之间需要空格隔开 # point = namedtuple('坐标','x y z') p = point(3,6,9) # 元素个数必须和namedtuple第二个参数一一对应 print(p) # 坐标(x=3, y=6, z=9) print(p.x) # 3 print(p.y) # 6 print(p.z) # 9
from collections import namedtuple cards = namedtuple('扑克',['color','num']) card = cards('♥','A') print(card) print(card.color) print(card.num)
2:deque(双端序列): 可以从左右两端插入值和弹出值的队列
from collections import deque l = deque(['a','b','c']) l.append(1) # 默认右侧插入 deque(['a', 'b', 'c', 1]) print(l) l.appendleft(2) # appendleft方法可以从左边插入 deque([2, 'a', 'b', 'c', 1]) print(l) res = l.pop() # 默认右侧弹出 有返回值 print(l,'\t',res) # deque([2, 'a', 'b', 'c']) 1 res1 = l.popleft() # popleft方法左侧弹出有返回值 print(l,'\t',res1) # deque(['a', 'b', 'c']) 2 l.insert(1,'d') # 还支持insert 按索引插入 print(l) # deque(['a', 'd', 'b', 'c'])
3:OrderedDict(有序字典)
from collections import OrderedDict o_d = OrderedDict([('a',1),('b',2),('c',3)]) print(o_d) # OrderedDict([('a', 1), ('b', 2), ('c', 3)]) # 在python3中效果不显著.在python2中测试OK.传入什么元素对应顺序的key就是什么
4:defaultdict(带有默认值字典):类似于dict.fromkeys() 不一样的是当统一的值是列表时.defultdict字典value的值都是不同的内存地址,不会像fromkeys似的,改变一个所有的都改变
l = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] from collections import defaultdict d = defaultdict(list) # 创建一个值都会为空列表的字典 for i in l: if i > 66: d['k1'].append(i) elif i < 66: d['k2'].append(i) # defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55], 'k1': [77, 88, 99, 90]}) print(d)
5:Counter(计数器) 返回一个以元素为key,元素个数为value的Counter类字典
s = 'abcdeabcdabcaba' # 判断s中每个字符出现的次数 d = {} for i in s: if i not in d: d[i] = 1 else: d[i] += 1 print(d) # {'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}
from collections import Counter s = 'abcdeabcdabcaba' res = Counter(s) print(res) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
2.time模块:时间模块3种表现形式..(1)时间戳 (2) 格式化时间 (3) 结构化时间
import time print(time.time()) # 时间戳,距伦敦时间1970.1.1 00:00:00 过去多少秒 print(time.strftime('%Y-%m-%d %H:%M:%S')) # 当前时间格式化 print(time.localtime()) # time.struct_time(tm_year=2019, tm_mon=7, tm_mday=18, tm_hour=18, tm_min=8, tm_sec=53, # tm_wday=3, tm_yday=199, tm_isdst=0) # 结构化时间
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 当前时区的名称 %% %号本身
三种时间表现形式转化:
3.datetime模块:时间模块
import datetime print(datetime.date.today()) # date只是年月日 2019-07-18 print(datetime.datetime.today()) # datetime详细信息 2019-07-18 18:17:30.981757 res = datetime.datetime.today() print(res.year) # 年 2019 print(res.month) # 月 7 print(res.day) # 日 18 print(res.weekday()) # 3(从0开始.0代表周一) print(res.isoweekday()) # 4 (1代表周一) res = datetime.timedelta(day=7) # datetime.timedelta对象代表两个时间之间的时间差
时间计算:
日期对象 = 日期对象 +/- timedelta对象
timedelta对象 = 日期对象 +/- 日期对象
4.random模块:随机模块 :
import random print(random.random()) # 0-1之间的随机浮点数,不包括0和1 print(random.randint(1,6)) # 生成1-6之间的随机整数,包括1和6 print(random.randrange(1,10,2)) # 从range(1,10,2)之中抽取一个整数 l = [1, 3, 334, 436, 636, 1231] print(random.choice(l)) # 随机抽取列表里的一个元素 random.shuffle(l) # 原地打乱列表里元素的顺序 print(l) print(random.sample(l,2)) # 随机抽取列表里的2个元素,不可能出现两个一样的
# 随机生成N位字母数字组成验证码的函数 import random def func(n): # n生成多少位的 code = '' for i in range(n): num = str(random.randint(0,9)) # 生成0-9的数字,为了拼接转为字符串 upper_pha = chr(random.randint(65,90)) # 根据ascii码表转为对应的大写字母 lower_pha = chr(random.randint(97,122)) # 根据ascii码表转为对应的小写字母 code += random.choice([num, upper_pha, lower_pha]) # 字符串拼接,保证字母数字生成的几率一样 return code print(func(6))
5.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的大小
6.sys模块: python解释器模块
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.argv: 命令行参数List,第一个元素是程序本身路径,可以设置权限
# 在命令行使用 针对管理员或测试 if len(sys.argv) <= 1: print('请输入用户名和密码') else: username = sys.argv[1] password = sys.argv[2] if username == 'name' and password == 'pwd': print('欢迎使用') else: print('用户不存在 无法执行当前文件')
7.json模块,pickle模块:序列化模块:由于写入文件的数据必须是字符串,网络传输的数据是二进制所以必须用到序列化和反序列化
序列化就是将其他数据类型转成字符串的过程
反序列化就是将字符串转成其他数据类型的过程
json 与 pickle的区别:
json:所有语言都支持json格式, 单json支持的数据类型少 有字符串,列表字典.整形,布尔值,元组 其中元组会转化为列表,json格式字符串必须是双引号
dumps: 序列化
import json d = {'name':18} res = json.dumps(d) print(res,type(res)) # {"name": 18} <class 'str'>
loads:反序列化
import json d = {'name':18} res = json.dumps(d) print(res,type(res)) # {"name": 18} <class 'str'> res1 = json.loads(res) print(res1,type(res1)) # {'name': 18} <class 'dict'>
dump: 序列化 与 dumps结果一致.但针对的是文件句柄,用于写入文件
load:反序列化 与 load结果一致.但针对的是文件句柄 用于读文件
pickle :方法与json中方法一致只支持python 他对python的左右数据类型都支持 用pickle模块操作文件时文件打开模式必须是b模式
8.subprosess模块:子进程模块
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'))