序列化 & 反序列化
把内存的数据类型转换成一种特定的格式,该格式的内容可用于存储或者传输给其他平台使用
内存中的数据类型——>序列化——>特定的格式(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' )
print ( confi. sections( ) )
print ( confi. options( 'section1' ) )
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'
passwds= [
'E1996325FGHY' ,
'A20080306qwer' ,
'2000306asdf' ,
'qwer20080306A' ,
'A16669852cyem'
]
dir = { }
for p in passwds:
res= hashlib. md5( p. encode( 'utf-8' ) )
dir [ p] = res. hexdigest( )
for k, v in dir . items( ) :
if v == m_m:
print ( '撞库成功,密码是%s' % k)
break