浅析Python中的序列化存储的方法


Posted in Python onApril 28, 2015

在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:

d = dict(name='Bob', age=20, score=88)

可以随时修改变量,比如把name改成'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化为'Bob'。

我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

Python提供两个模块来实现序列化:cPickle和pickle。这两个模块功能是一样的,区别在于cPickle是C语言写的,速度快,pickle是纯Python写的,速度慢,跟cStringIO和StringIO一个道理。用的时候,先尝试导入cPickle,如果失败,再导入pickle:

try:
  import cPickle as pickle
except ImportError:
  import pickle

首先,我们尝试把一个对象序列化并写入文件:

>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d)
"(dp0\nS'age'\np1\nI20\nsS'score'\np2\nI88\nsS'name'\np3\nS'Bob'\np4\ns."

pickle.dumps()方法把任意对象序列化成一个str,然后,就可以把这个str写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:

>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()

看看写入的dump.txt文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。

当我们要把对象从磁盘读到内存时,可以先把内容读到一个str,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。我们打开另一个Python命令行来反序列化刚才保存的对象:

>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'age': 20, 'score': 88, 'name': 'Bob'}

变量的内容又回来了!

当然,这个变量和原来的变量是完全不相干的对象,它们只是内容相同而已。

Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。

Python 相关文章推荐
Python 的 with 语句详解
Jun 13 Python
将Python中的数据存储到系统本地的简单方法
Apr 11 Python
python 调用HBase的简单实例
Dec 18 Python
浅谈python日志的配置文件路径问题
Apr 28 Python
python 批量修改/替换数据的实例
Jul 25 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
Python restful框架接口开发实现
Apr 13 Python
python 实现仿微信聊天时间格式化显示的代码
Apr 17 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
Django配置Bootstrap, js实现过程详解
Oct 13 Python
Python-openpyxl表格读取写入的案例详解
Nov 02 Python
详解在Python和IPython中使用Docker
Apr 28 #Python
在Python程序中进行文件读取和写入操作的教程
Apr 28 #Python
介绍Python中的文档测试模块
Apr 28 #Python
Django中几种重定向方法
Apr 28 #Python
详解Python的单元测试
Apr 28 #Python
Python xlrd读取excel日期类型的2种方法
Apr 28 #Python
Python发送email的3种方法
Apr 28 #Python
You might like
PHP中的reflection反射机制测试例子
2014/08/05 PHP
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
JavaScript Date对象应用实例分享
2017/10/30 Javascript
Vue自定义指令封装节流函数的方法示例
2018/07/09 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
python简单猜数游戏实例
2015/07/09 Python
Python Numpy 数组的初始化和基本操作
2018/03/13 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
mac下如何将python2.7改为python3
2018/07/13 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
意大利奢侈品网站:Italist
2016/08/23 全球购物
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
斯福泰克软件测试面试题
2015/02/16 面试题
岗位竞聘演讲稿范文
2014/04/24 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
班级读书活动总结
2014/06/30 职场文书
乡镇干部党的群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL