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'))

 

posted @ 2019-07-18 20:06  人生能有几回搏  阅读(241)  评论(0编辑  收藏  举报