day16 常用模块 其他模块

 json 和 pickle模块

1.0 什么是序列化和反序列化

  

 1 内存中的数据类型---->序列化---->特定的格式(json格式或者pickle格式)
 2     内存中的数据类型<----反序列化<----特定的格式(json格式或者pickle格式)
 3 
 4 以前常用办法:
 5     {'aaa':111} --->  序列化 str({'aaa':111})  ----->   "{'aaa':111}"
 6 
 7     {'aaa':111} <--- 反序列化 eval("{'aaa':111}")  <-----  "{'aaa':111}"
 8 编程举例:
 9     l1={'aaa':111} #字典 dict
10     #序列化
11     l2=str(l1)
12     print(l2,type(l2))
13     # 反序列化
14     l3=eval(l2)
15     print(l3,type(l3))
2.0 为何要序列化
1  序列化得到结果=>特定的格式的内容有两种用途
2   1、可用于存储=》用于存档
3   2、传输给其他平台使用=》跨平台数据交互
4        python                 java
5         列表     特定的格式      数组
6 
7   强调:
8       针对用途1的特定一格式:可是一种专用的格式=》pickle只有python可以识别
9       针对用途2的特定一格式:应该是一种通用、能够被所有语言识别的格式=》json
3、如何序列化与反序列化
 1 示范1
 2 import json
 3 # 序列化
 4 json_res=json.dumps([1,'aaa',True,False])
 5 # print(json_res,type(json_res)) # "[1, "aaa", true, false]"
 6 
 7 # 反序列化
 8 l=json.loads(json_res)
 9 print(l,type(l))
10 
11 
12 示范2:
13 import json
14 
15 序列化的结果写入文件的复杂方法
16 json_res=json.dumps([1,'aaa',True,False])
17 # print(json_res,type(json_res)) # "[1, "aaa", true, false]"
18 with open('test.json',mode='wt',encoding='utf-8') as f:
19     f.write(json_res)
20 
21 将序列化的结果写入文件的简单方法
22 with open('test.json',mode='wt',encoding='utf-8') as f:
23     json.dump([1,'aaa',True,False],f)
24 
25 
26 从文件读取json格式的字符串进行反序列化操作的复杂方法
27 with open('test.json',mode='rt',encoding='utf-8') as f:
28     json_res=f.read()
29     l=json.loads(json_res)
30     print(l,type(l))
31 
32 从文件读取json格式的字符串进行反序列化操作的简单方法
33 with open('test.json',mode='rt',encoding='utf-8') as f:
34     l=json.load(f)
35     print(l,type(l))
36 
37 
38 json验证: json格式兼容的是所有语言通用的数据类型,不能识别某一语言的所独有的类型
39 json.dumps({1,2,3,4,5})
40 
41 json强调:一定要搞清楚json格式,不要与python混淆
42 l=json.loads('[1, "aaa", true, false]')
43 l=json.loads("[1,1.3,true,'aaa', true, false]")
44 print(l[0])
45 
46 了解
47 l = json.loads(b'[1, "aaa", true, false]')
48 print(l, type(l))
49 
50 with open('test.json',mode='rb') as f:
51     l=json.load(f)
52 
53 
54 res=json.dumps({'name':'哈哈哈'})
55 print(res,type(res))
56 
57 res=json.loads('{"name": "\u54c8\u54c8\u54c8"}')
58 print(res,type(res))
4.0猴子补丁
 1 在入口处打猴子补丁
 2 import json
 3 import ujson
 4 
 5 def monkey_patch_json():
 6     json.__name__ = 'ujson'
 7     json.dumps = ujson.dumps
 8     json.loads = ujson.loads
 9 
10 monkey_patch_json() # 在入口文件出运行
11 
12 
13 import ujson as json # 不行
14 
15 后续代码中的应用
16 json.dumps()
17 json.dumps()
18 json.dumps()
19 json.dumps()
20 json.dumps()
21 json.dumps()
22 json.dumps()
23 json.dumps()
24 json.loads()
25 json.loads()
26 json.loads()
27 json.loads()
28 json.loads()
29 json.loads()
30 json.loads()
31 json.loads()
32 json.loads()
33 json.loads()
34 json.loads()
5.0 pickle模块
1 import pickle
2 res=pickle.dumps({1,2,3,4,5})
3 print(res,type(res))
4 
5 s=pickle.loads(res)
6 print(s,type(s))
6.0 configparser 模块
 1 import configparser
 2 
 3 config=configparser.ConfigParser()
 4 config.read('test.ini')
 5 
 6 1、获取sections
 7 print(config.sections())
 8 
 9 2、获取某一section下的所有options
10 print(config.options('section1'))
11 
12 3、获取items
13 print(config.items('section1'))
14 
15 416 res=config.get('section1','user')
17 print(res,type(res))
18 
19 res=config.getint('section1','age')
20 print(res,type(res))
21 
22 
23 res=config.getboolean('section1','is_admin')
24 print(res,type(res))
25 
26 
27 res=config.getfloat('section1','salary')
28 print(res,type(res))

7.0 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())



 m.update(文件所有的内容)
 m.hexdigest()

 f=open('a.txt',mode='rb')
 f.seek()
 f.read(2000) # 巨琳
 m1.update(文见的一行)

 m1.hexdigest()

 

8.0subprocess模块
 1 import subprocess
 2 
 3 obj=subprocess.Popen('echo 123 ; ls / ; ls /root',shell=True,
 4                  stdout=subprocess.PIPE,
 5                  stderr=subprocess.PIPE,
 6                  )
 7 
 8 print(obj)
 9 res=obj.stdout.read()
10 print(res.decode('utf-8'))
11 
12 err_res=obj.stderr.read()
13 print(err_res.decode('utf-8'))

posted @ 2020-08-02 21:22  一个土豆芽  阅读(102)  评论(0编辑  收藏  举报