定义
serialization 序列化 将内存中对象存储下来,把它变成一个个字节。-> 二进制 deserialization 反序列化,将文件的一个个字节恢复成内存中对象。<- 二进制 序列化保存到文件就是持久化。 可以将数据序列化后持久化,或者网络传输;也可以将从文件中或者网络接收到的字节序列反序列化.
pickel库
函数 说明 dumps 对象序列化为bytes对象 dump 对象序列化到文件对象,就是存入文件 loads 从bytes对象反序列化 load 对象反序列化,从文件读取数据
import pickle
a = 97
b = 61
c = 'c'
d = [ 48 , 'abcd' ]
e = { 'a' : 'aaaaa' , 'b' : 1 }
with open ( 'f:/work/001/a.txt' , 'wb+' ) as f:
pickle. dump( a, f)
pickle. dump( b, f)
pickle. dump( c, f)
pickle. dump( d, f)
pickle. dump( e, f)
f1 = open ( 'f:/work/001/a.txt' , encoding= 'ANSI' )
f1. read( )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'€\x03Ka.€\x03K=.€\x03X\x01\x00\x00\x00cq\x00.€\x03]q\x00(K0X\x04\x00\x00\x00abcdq\x01e.€\x03}q\x00(X\x01\x00\x00\x00aq\x01X\x05\x00\x00\x00aaaaaq\x02X\x01\x00\x00\x00bq\x03K\x01u.'
with open ( 'f:/work/001/a.txt' , 'rb+' ) as f:
for i in range ( 5 ) :
x = pickle. load( f)
print ( x, type ( x) )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
97 < class 'int' >
61 < class 'int' >
c < class 'str' >
[ 48 , 'abcd' ] < class 'list' >
{ 'a' : 'aaaaa' , 'b' : 1 } < class 'dict' >
下例中,序列化其实就保存了一个类名,因为所有的其他东西都是类定义的东西,是不变的,所以只序列化一个AAA类名。反序列化的时候找到类就可以恢复一个对象
import pickle
class AAA :
tttt = 'ABC'
def show ( self) :
print ( 'abc' )
a1 = AAA( )
ser = pickle. dumps( a1)
print ( 'ser={}' . format ( ser) )
a2 = pickle. loads( ser)
print ( a2. tttt)
a2. show( )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ser= b'\x80\x03c__main__\nAAA\nq\x00)\x81q\x01.'
ABC
abc
下列可以看出除了必须保存的AAA,还序列化了aaaa和abc,因为这是每一个对象自己的属性,每一个对象不一样的,所以这些数据需要序列化。
import pickle
class AAA :
def __init__ ( self) :
self. aaaa = 'abc'
a1 = AAA( )
ser = pickle. dumps( a1)
print ( 'ser={}' . format ( ser) )
a2 = pickle. loads( ser)
print ( a2, type ( a2) )
print ( a2. aaaa)
print ( id ( a1) , id ( a2) )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ser= b'\x80\x03c__main__\nAAA\nq\x00)\x81q\x01}q\x02X\x04\x00\x00\x00aaaaq\x03X\x03\x00\x00\x00abcq\x04sb.'
< __main__. AAA object at 0x000002572E9AAE80 > < class '__main__.AAA' >
abc
2573467299568 2573467299456
Json
Json 的数据类型
值 : 双引号引起来的字符串,数值,true和false,null,对象,数组,这些都是值
字符串 : 由双引号包围起来的任意字符的组合,可以有转义字符。 import json
d = 'abcd\ne\rf'
j = json. dumps( d)
print ( j)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
"abcd\ne\rf"
import json
d = - 12222.66
j = json. dumps( d)
print ( j, type ( j) )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- 12222.66 < class 'str' >
对象 : 无序的键值对的集合,格式: {key1:value1, … ,keyn:valulen}, key必须是一个字符串 ,需要双引号包围这个字符串。value可以是任意合法的值。 import json
d = { 'a' : 100 , 'b' : 200 , 'c' : 'abcd' , 'd' : [ 1 , 2 , 3 ] , 'e' : ( 'a' , 10 , 'b' , 20 ) }
j = json. dumps( d)
print ( d, type ( d) )
print ( j, type ( j)
p1 = json. loads( j)
print ( p1, type ( p1) )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{ 'a' : 100 , 'b' : 200 , 'c' : 'abcd' , 'd' : [ 1 , 2 , 3 ] , 'e' : ( 'a' , 10 , 'b' , 20 ) } < class 'dict' >
{ "a" : 100 , "b" : 200 , "c" : "abcd" , "d" : [ 1 , 2 , 3 ] , "e" : [ "a" , 10 , "b" , 20 ] } < class 'str' >
{ 'a' : 100 , 'b' : 200 , 'c' : 'abcd' , 'd' : [ 1 , 2 , 3 ] , 'e' : [ 'a' , 10 , 'b' , 20 ] } < class 'dict' >
数组 : 有序的值的集合格式:[val1,…,valn]
json模块
Python支持少量内建数据类型到Json类型的转换
Python类型 Json类型 True true False false None null str string int integer float float list array dict object
常用方法
Python类型 Json类型 dumps json编码 dump json编码并存入文件 loads json解码 load json解码,从文件读取数据
import json
d = { 'name' : 'Tom' , 'age' : 20 , 'interest' : ( 'music' , 'movie' ) , 'class' : [ 'python' ] }
j = json. dumps( d)
print ( j, type ( j) )
d1 = json. loads( j)
print ( d1, type ( d1) )
print ( id ( d) , id ( d1) )
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{ "name" : "Tom" , "age" : 20 , "interest" : [ "music" , "movie" ] , "class" : [ "python" ] } < class 'str' >
{ 'name' : 'Tom' , 'age' : 20 , 'interest' : [ 'music' , 'movie' ] , 'class' : [ 'python' ] } < class 'dict' >
2573467259744 2573466592096
一般json编码的数据很少落地,数据都是通过网络传输。传输的时候,要考虑压缩它。本质上来说它就是个文本,就是个字符串
MessagePack
常用方法
packb 序列化对象。提供了dumps来兼容pickle和json unpackb 反序列化对象。提供了loads来兼容。 pack 序列化对象保存到文件对象。提供了dump来兼容。 unpack 反序列化对象保存到文件对象。提供了load来兼容