import struct
import base64
import itertools
import chardet
from collections import namedtuple,defaultdict,OrderedDict,Counter
# namedtuple 新建1个元组,并设置元素的属性和个数
# namedtuple('名称','列表')
# 例如 namedtuple('Circle', ['x', 'y', 'r'])
# dqueue 高效插入和删除操作的双向列表,适合于队列和栈
# defaultdict 用于键不存在时,返回一个默认值,用于字典中
# 创建默认值的字典
# defaultdict(lambda :'n/a')
# ChainMap
# OrderedDict 使字典有序,用 OrderedDict 按照插入的顺序排列
# 为FIFO(先进先出)的dict,当字典满时,需要再插入数据,会删除最早插入的数据
# Counter 统计字符中各字符的个数
c=Counter()
for i in 'this is a stirng':
c[i]=c[i]+1
print(c)
#base64 用64个字符,表示二进制数据的一种方式,用于处理二进制数据与字符串之间进行转换,可被认为是进行简单加密和解密
# 每3个字节一组 共3*8=24bit 每组6bit
# 二进制数据不足3的倍数,则在x00后加上不定数的=,加几个=,则表示补了几个字节
# 适用于不重要的信息进行加密,一般用户证书 cookie 网页 及在url传输少量二进制数据
# struct 用于处理bytes与其他二进制数据之间的转换
# 任意类型->bytest
# > 网络序 I 无符号整数
result=struct.pack(">I",24)
print(result)
# bytes->任意类型
# 后面的bytes依次变为I H 4字节无符号整数 I 2字节无符号整数
result=struct.unpack(">IH",b'xf0xf0xf0xf0x80x80')
print(result)
# itertools 用于操作迭代对象
#把一个序列无线重复下去
# itertools.cycle()
#把一个元素无线重复下去,除非指定次数
# itertools.repeat()
# 可通过条件判断取出一个有限序列
c=itertools.count(1,5)
r=itertools.takewhile(lambda x:x<=10,c)
print(list(r))
# 可以把一组迭代对象串联起来,形成一个更大的迭代器
itertools.chain()
# 把迭代器中相邻的重复元素挑出来放在一起,返回值做为组的key
for key,group in itertools.groupby("testing",lambda t:t.upper()):
print(key,list(group))
# xml 用于处理xml格式文件及格式数据
# sax:流模式 边解析边读,占用内存小,解析快,需要自定义处理事件
# dom:树模式 解析慢 占用内存大,但可以遍历任意节点
# chardet 用于检测对象使用了哪类编码
# result=chardet.detect(b"test")
data="test".encode('utf-8')
result=chardet.detect(data)
print(result)