一.collection 模块
python拥有一些内置的数据类型,比如 str,list.tuple.dict.set等
collection模块在这些内置的数据类型的基础上,提供了额外的数据类型:
- namedtuple 具名元组 :
- 生成可以使用名字来访问元素内容的元组
- deque 双端队列:
- 可以快速的从另外一侧追加和退出对象
-
Counter 计数器:
- 主要用来计数
- 按照键值对插入的顺序排序,不是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
OrderedDict 有序字典:
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'))