序列化 & 反序列化
把内存的数据类型转换成一种特定的格式,该格式的内容可用于存储或者传输给其他平台使用
内存中的数据类型——>序列化——>特定的格式(json格式或者pickle格式)
内存中的数据类型<——反序列化<——特定的格式(json格式或者pickle格式)
用途:
- 可用于存储——>用于存档
- 传输给其他平台使用——>跨平台数据交互
针对用途1的特定格式:可以用一种专用的格式——>pickle 只有python可以识别
针对用途2的特定格式:应该是一种通用,能够被所有语言识别的格式=》json
如何序列化与反序列化
JSON函数:
json.dumps
将 Python 对象编码成 JSON 字符串
import json
#序列化
dumps_res=json.dumps([1,'aaa',True,False])
print(dumps_res,type(dumps_res))
'''
[1, "aaa", true, false] <class 'str'>
'''
json.loads
将已编码的 JSON 字符串解码为 Python 对象
#反序列化
loads_res=json.loads(dumps_res)
print(loads_res,type(loads_res))
'''
[1, 'aaa', True, False] <class 'list'>
'''
将一个数据序列化后的内容存储在文件当中,再反序列
dumps_res=json.dumps([1,'aaa',True,False])
with open(r'D:\python\text.txt',mode='wt',encoding='UTF-8') as f:
f.write(dumps_res)
with open(r'D:\python\text.txt',mode='rt',encoding='UTF-8') as f:
loads_res=f.read()
l=json.loads(loads_res)
print(l)
'''
[1, 'aaa', True, False]
'''
上述的简单方法:
json.dump
with open(r'D:\python\text.txt',mode='wt',encoding='UTF-8') as f:
json.dump([1,'aaa',True,False],f)
json.load
with open(r'D:\python\text.txt',mode='rt',encoding='UTF-8') as f:
l=json.load(f)
print(l)
'''
[1, 'aaa', True, False]
'''
python 原始类型向 json 类型的转化对照表:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
Python中集合类型无法转化为JSON类型
猴子补丁
import json
import ujson
def monkey_patch_json():
json.__name__ = 'ujson'
json.dumps = ujson.dumps
json.loads = ujson.loads
monkey_patch_json() # 在入口文件处运行
pickle模块
import pickle
res=pickle.dumps({1,2,3,5,6})
print(res,type(res))
'''
b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00\x8f\x94(K\x01K\x02K\x03K\x05K\x06\x90.'
<class 'bytes'>
'''
注意
在python3中执行的序列化操作如何兼容python2?
python2不支持protocol>2,默认python3中protocol=4,所以在python3中dump操作应该指定protocol=2
pickle.dump('你好啊',protocol=2)
configparser模块
ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section), 每个节可以有多个参数(键=值)。使用的配置文件的好处就是不用在程序员写死,可以使程序更灵活。
注意:在python 3 中ConfigParser模块名已更名为configparser
#text.ini文件下:
[section1]
k1=v1
k2:v2
user=egon
age=18
is_admin=true
salary=31
[section2]
k3=3
import configparser
confi=configparser.ConfigParser()
confi.read(r'D:\python\text.ini')
#获取sections
print(confi.sections())
#获取某个section下的所有options
print(confi.options('section1'))
#获取items
print(confi.items('section1'))
#获取某个特定的值
print(confi.get('section1','user'))
'''
['section1', 'section2']
['k1', 'k2', 'user', 'age', 'is_admin', 'salary']
[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'),
('salary', '31')]
egon
'''
hashlib模块
hash一类算法,该算法接受传入的内容,经过计算得到一串hash值
hash值的特点:
-
只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验
-
不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码
-
只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的
用途1:特点2用于密码密文传输与验证
用途2:特点1、3用于文件完整性校验
特点1、3的验证:
import hashlib
m = hashlib.md5()
m.update('hello'.encode('utf-8'))
m.update('world'.encode('utf-8'))
res = m.hexdigest()
print(res)
m1 = hashlib.md5()
m1.update('he'.encode('utf-8'))
m1.update('llo'.encode('utf-8'))
m1.update('world'.encode('utf-8'))
ret = m1.hexdigest()
print(ret)
'''
fc5e038d38a57032085441e7fe7010b0
fc5e038d38a57032085441e7fe7010b0
'''
如何使用hashlib
撞库:
m='A20080306qwer' #明文密码
m_md5=hashlib.md5(m.encode('utf-8'))
m_m=m_md5.hexdigest()
m_m='f4921bfc59d1c4b1ba09b38a2e122716' #以md5转化了密文
passwds=[
'E1996325FGHY',
'A20080306qwer',
'2000306asdf',
'qwer20080306A',
'A16669852cyem'
]
#密码库,通过事先猜测密码,形成明文密码库
dir={}
for p in passwds:
res=hashlib.md5(p.encode('utf-8')) #将密码库的密码用md5方式转化
dir[p]=res.hexdigest() #并形成字典,明文密码:密文密码
# print(dir)
for k,v in dir.items():
if v == m_m: #对比密码库中的密文密码与截获到的密文密码进行对比
print('撞库成功,密码是%s'%k) #打印出明文密码
break