python序列化和反序列化

定义
  • serialization 序列化
  • 将内存中对象存储下来,把它变成一个个字节。-> 二进制
  • deserialization 反序列化,将文件的一个个字节恢复成内存中对象。<- 二进制
  • 序列化保存到文件就是持久化。
  • 可以将数据序列化后持久化,或者网络传输;也可以将从文件中或者网络接收到的字节序列反序列化.
pickel库
  • Python中的序列化、反序列化模块
函数说明
dumps对象序列化为bytes对象
dump对象序列化到文件对象,就是存入文件
loads从bytes对象反序列化
load对象反序列化,从文件读取数据
import pickle
a = 97
b = 61
c = 'c'
d = [48, 'abcd']
e = {'a':'aaaaa','b':1}

# dump 序列化  
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.'  #序列化得到的结果
# load 反序列化
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() # 创建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() # 创建AAA类的对象

# 序列化
ser = pickle.dumps(a1)
print('ser={}'.format(ser)) # AAA aaaa abc

# 反序列化
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)}  # 列表,元组经过json序列化后都转化为数组.
      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类型
Truetrue
Falsefalse
Nonenull
strstring
intinteger
floatfloat
listarray
dictobject
常用方法
Python类型Json类型
dumpsjson编码
dumpjson编码并存入文件
loadsjson解码
loadjson解码,从文件读取数据
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来兼容
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值