一、序列化模块
# 1、什么是序列化&反序列化# 内存中的数据类型---->序列化---->特定的格式(json格式或者pickle格式)
# 内存中的数据类型<----反序列化<----特定的格式(json格式或者pickle格式) # 土办法: # {'aaa':111}--->序列化str({'aaa':111})----->"{'aaa':111}" # {'aaa':111}<---反序列化eval("{'aaa':111}")<-----"{'aaa':111}"
# 2、为何要序列化
# 序列化得到结果=>特定的格式的内容有两种用途 # 1、可用于存储=》用于存档 # 2、传输给其他平台使用=》跨平台数据交互 # python java # 列表 特定的格式 数组 # 强调: # 针对用途1的特定一格式:可是一种专用的格式=》pickle只有python可以识别 # 针对用途2的特定一格式:应该是一种通用、能够被所有语言识别的格式=》json
# 3、如何序列化与反序列化
# 示范1 # import json # # 序列化 # json_res=json.dumps([1,'aaa',True,False]) # # print(json_res,type(json_res)) # "[1, "aaa", true, false]" # # # 反序列化 # l=json.loads(json_res) # print(l,type(l))
# 示范2:
import json # 序列化的结果写入文件的复杂方法 # json_res=json.dumps([1,'aaa',True,False]) # # print(json_res,type(json_res)) # "[1, "aaa", true, false]" # with open('test.json',mode='wt',encoding='utf-8') as f: # f.write(json_res) # 将序列化的结果写入文件的简单方法 # with open('test.json',mode='wt',encoding='utf-8') as f: # json.dump([1,'aaa',True,False],f) # 从文件读取json格式的字符串进行反序列化操作的复杂方法 # with open('test.json',mode='rt',encoding='utf-8') as f: # json_res=f.read() # l=json.loads(json_res) # print(l,type(l)) # 从文件读取json格式的字符串进行反序列化操作的简单方法 # with open('test.json',mode='rt',encoding='utf-8') as f: # l=json.load(f) # print(l,type(l)) # json验证: json格式兼容的是所有语言通用的数据类型,不能识别某一语言的所独有的类型 # json.dumps({1,2,3,4,5}) # json强调:一定要搞清楚json格式,不要与python混淆 # l=json.loads('[1, "aaa", true, false]') # l=json.loads("[1,1.3,true,'aaa', true, false]") # print(l[0]) # 了解 # l = json.loads(b'[1, "aaa", true, false]') # print(l, type(l)) # with open('test.json',mode='rb') as f: # l=json.load(f) # res=json.dumps({'name':'哈哈哈'}) # print(res,type(res)) # res=json.loads('{"name": "u54c8u54c8u54c8"}') # print(res,type(res))
# 4、猴子补丁
# 一.什么是猴子补丁?
属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。
猴子补丁的核心就是用自己的代码替换所用模块的源代码,详细地如下
1,这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原装的,在英文里guerilla发音和gorllia(猩猩)相似,再后来就写了monkey(猴子)。
2,还有一种解释是说由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey Patch。
# 二. 猴子补丁的功能(一切皆对象)
1.拥有在模块运行时替换的功能, 例如: 一个函数对象赋值给另外一个函数对象(把函数原本的执行的功能给替换了)
# 在入口处打猴子补丁 # import json # import ujson # # def monkey_patch_json(): # json.__name__ = 'ujson' # json.dumps = ujson.dumps # json.loads = ujson.loads # # monkey_patch_json() # 在入口文件出运行 # import ujson as json # 不行 # 后续代码中的应用 # json.dumps() # json.dumps() # json.dumps() # json.loads() # json.loads()
# 5.pickle模块
import pickle # res=pickle.dumps({1,2,3,4,5}) # print(res,type(res)) # s=pickle.loads(res) # print(s,type(s))
configparser模块
配置文件
# 注释1 ; 注释2 [section1] k1 = v1 k2:v2 user=egon age=18 is_admin=true salary=31 [section2] k1 = v1
读取
import configparser config=configparser.ConfigParser() config.read('a.cfg') #查看所有的标题 res=config.sections() #['section1', 'section2'] print(res) #查看标题section1下所有key=value的key options=config.options('section1') print(options) #['k1', 'k2', 'user', 'age', 'is_admin', 'salary'] #查看标题section1下所有key=value的(key,value)格式 item_list=config.items('section1') print(item_list) #[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')] #查看标题section1下user的值=>字符串格式 val=config.get('section1','user') print(val) #egon #查看标题section1下age的值=>整数格式 val1=config.getint('section1','age') print(val1) #18 #查看标题section1下is_admin的值=>布尔值格式 val2=config.getboolean('section1','is_admin') print(val2) #True #查看标题section1下salary的值=>浮点型格式 val3=config.getfloat('section1','salary') print(val3) #31.0
import configparser config=configparser.ConfigParser() config.read('test.ini') # 1、获取sections # print(config.sections()) # 2、获取某一section下的所有options # print(config.options('section1')) # 3、获取items # print(config.items('section1')) # 4、 # res=config.get('section1','user') # print(res,type(res)) # res=config.getint('section1','age') # print(res,type(res)) # res=config.getboolean('section1','is_admin') # print(res,type(res)) # res=config.getfloat('section1','salary') # print(res,type(res))
hashlib模块
# 1、什么是哈希hash # hash一类算法,该算法接受传入的内容,经过运算得到一串hash值 # hash值的特点: #I 只要传入的内容一样,得到的hash值必然一样 #II 不能由hash值返解成内容 #III 不管传入的内容有多大,只要使用的hash算法不变,得到的hash值长度是一定 # 2、hash的用途 # 用途1:特点II用于密码密文传输与验证 # 用途2:特点I、III用于文件完整性校验 # 3、如何用 # import hashlib # # m=hashlib.md5() # m.update('hello'.encode('utf-8')) # m.update('world'.encode('utf-8')) # res=m.hexdigest() # 'helloworld' # print(res) # # m1=hashlib.md5('he'.encode('utf-8')) # m1.update('llo'.encode('utf-8')) # m1.update('w'.encode('utf-8')) # m1.update('orld'.encode('utf-8')) # res=m1.hexdigest()# 'helloworld' # print(res) # 模拟撞库 # cryptograph='aee949757a2e698417463d47acac93df' # import hashlib # # # 制作密码字段 # passwds=[ # 'alex3714', # 'alex1313', # 'alex94139413', # 'alex123456', # '123456alex', # 'a123lex', # ] # # dic={} # for p in passwds: # res=hashlib.md5(p.encode('utf-8')) # dic[p]=res.hexdigest() # # # 模拟撞库得到密码 # for k,v in dic.items(): # if v == cryptograph: # print('撞库成功,明文密码是:%s' %k) # break # 提升撞库的成本=>密码加盐 import hashlib m=hashlib.md5() m.update('天王'.encode('utf-8')) m.update('alex3714'.encode('utf-8')) m.update('盖地虎'.encode('utf-8')) print(m.hexdigest())
subprocess模块
mport subprocess obj=subprocess.Popen('echo 123 ; ls / ; ls /root',shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) # print(obj) # res=obj.stdout.read() # print(res.decode('utf-8')) err_res=obj.stderr.read() print(err_res.decode('utf-8'))