python的序列化和反序列化

栏目: Python · 发布时间: 2年前

来源: juejin.im

内容简介:当程序运行时,所有的变量或者对象都是存储到内存中的,一旦程序调用完成,这些变量或者对象所占有的内存都会被回收。而为了实现变量和对象持久化的存储到磁盘中或在网络上进行传输,我们需要将变量或者对象转化为二进制流的方式。 而将其转化为二进制流的过程就是序列化。而反序列化就是说程序运行的时候不能从磁盘中进行读取,需要将序列化的对象或者变量从磁盘中转移到内存中,同时也会将二进制流转换为原来的数据格式。我们把这一过程叫做反序列化。这里主要讲两个模块pickle模块和json模块

本文转载自:https://juejin.im/post/5be4e7b5e51d4535b07d1590,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。

当程序运行时,所有的变量或者对象都是存储到内存中的,一旦程序调用完成,这些变量或者对象所占有的内存都会被回收。而为了实现变量和对象持久化的存储到磁盘中或在网络上进行传输,我们需要将变量或者对象转化为二进制流的方式。 而将其转化为二进制流的过程就是序列化。

2. 什么是反序列化

而反序列化就是说程序运行的时候不能从磁盘中进行读取,需要将序列化的对象或者变量从磁盘中转移到内存中,同时也会将二进制流转换为原来的数据格式。我们把这一过程叫做反序列化。

3. python如何实现序列化和反序列化

这里主要讲两个模块pickle模块和 json 模块

3.1 pickle模块

dump(object)和dumps(objects)是序列化 load(byte)和loads(byte)是反序列化

import pickle

dict1 = {'a': 1, 'b': 2}
dict2 = pickle.dumps(dict1)
print(dict2,type(dict2),id(dict2))
dict3 = pickle.loads(dict2)
print(dict3,type(dict3),id(dict3))
复制代码

D:\python\Python36\python.exe E:/demo/-python-/handlers/test.py b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01K\x01X\x01\x00\x00\x00bq\x02K\x02u.' <class 'bytes'> 1536157390816 {'a': 1, 'b': 2} <class 'dict'> 1536043176080

输出结果可以看出两者在内存中的地址并不相同,原因是我们在将字典序列化后,字典调用结束确实在内存中释放了,而反序列化后又从磁盘中取出并在内存中重新划分了一块内存,因此地址显示不同。

dump和load是序列化和反序列化到文件中去

import pickle
import os

dict1 = {'a': 1, 'b': 2}
file = open(os.path.join(os.path.abspath('.'), '1.txt'), 'wb')
dict2 = pickle.dump(dict1, file)
file.close()
print(dict2, type(dict2), id(dict2))
file1 = open(os.path.join(os.path.abspath('.'), '1.txt'), 'rb')
dict3 = pickle.load(file1)
file1.close()
print(dict3, type(dict3), id(dict3))
复制代码

None <class 'NoneType'> 1805423824 {'a': 1, 'b': 2} <class 'dict'> 2622050204264

3.2 json模块

json.dumps:将 python 格式转化为json的字符串形式 json.loads:将json的字符串格式转换为python的数据格式

import json

dict1 = {'a': 1, 'b': 2}
dict2 = json.dumps(dict1)
print(dict2, type(dict2), id(dict2))
dict3 = json.loads(dict2)
print(dict3, type(dict3), id(dict3))
复制代码

{"a": 1, "b": 2} <class 'str'> 2040970141536 {'a': 1, 'b': 2} <class 'dict'> 2040937894392

json.dump:序列化到文件中 json.load: 将文件中的内容反序列化

import os

dict1 = {'a': 1, 'b': 2}
file1 = open(os.path.join(os.path.abspath('.'), '1.txt'), 'w')
dict2 = json.dump(dict1, file1)
file1.close()
print(dict2, type(dict2), id(dict2))
file2 = open(os.path.join(os.path.abspath('.'), '1.txt'), 'r')
dict3 = json.load(file2)
print(dict3, type(dict3), id(dict3))
复制代码

None <class 'NoneType'> 1805423824 {'a': 1, 'b': 2} <class 'dict'> 1907991182648

参考: blog.csdn.net/reuxfhc/art… blog.csdn.net/u012993796/…


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

关注码农网公众号

关注我们,获取更多IT资讯^_^


查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法Ⅰ-Ⅳ

算法Ⅰ-Ⅳ

塞奇威克 / 中国电力出版社 / 2003-11 / 70.00元

《算法I-IV(C实现):基础、数据结构、排序和搜索(第3版)(影印版)》实为一个卓越的读本,作为一个普通的程序员,如果在数学分析方面不算熟练,同时又对理论算法很感兴趣,那么这《算法I-IV(C实现):基础、数据结构、排序和搜索(第3版)(影印版)》确定不容错过,由此你将获益匪浅。Sedgewick擅长深入浅出的方式来解释概念,他在这方面确有天分。另外书中使用了一些实践程序,其篇幅仅有一页左右,而......一起来看看 《算法Ⅰ-Ⅳ》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具