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

?
1
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:

?
1
2
3
4
try:
  import cPickle as pickle
except ImportError:
  import pickle

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

?
1
2
3
>>> 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:

?
1
2
3
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()

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

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

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

变量的内容又回来了!

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

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

浅析Python中的序列化存储的方法相关推荐

  1. python中的序列类型数据结构元素的切片操作_浅析python中的分片与截断序列

    浅析python中的分片与截断序列 序列概念 在分片规则里list.tuple.str(字符串)都可以称为序列,都可以按规则进行切片操作 切片操作 注意切片的下标0代表顺序的第一个元素,-1代表倒序的 ...

  2. python中的列表和元组_浅析Python中的列表和元组

    区别列表是动态数组,它们可变且可以重设长度(改变其内部元素的个数). 元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变. 元组缓存于Python运行时环境,这意味着我们每次使用元组时无须访问 ...

  3. python多线程好还是多协程好_深入浅析python中的多进程、多线程、协程

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  4. Python中的静态类变量和方法

    问: 如何在 Python 中创建静态类变量或方法? 答1: huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效. 在类定义内但不在方法内声明的变量是 ...

  5. Python中optionParser模块的使用方法实例教程

    Python中optionParser模块的使用方法实例教程 转载  2014-08-29   投稿:shichen2014    我要评论 这篇文章主要介绍了Python中optionParser模 ...

  6. Python中range函数的使用方法

    Python中range函数的使用方法 更新时间:2022年05月30日 11:38:15   作者:Python编程学习圈 这篇文章主要介绍了Python中range函数的使用方法,文章基于Pyth ...

  7. Python精讲:在Python中遍历字典的三大方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中遍历字典的三大方法详解>.本知识点主要内容有:使用字典对象的items()方法可以遍历字典的项和字典的&qu ...

  8. 在Python中连接字符串的首选方法是什么?

    本文翻译自:Which is the preferred way to concatenate a string in Python? Since Python's string can't be c ...

  9. 关于python中requests模块导入问题-python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...

最新文章

  1. 【大话Hibernate】hibernate缓存详解
  2. 2017已过半,这半年,你累吗?
  3. python中__init__方法_关于python中__init__方法理解
  4. Monkey稳定性测试初探(二)
  5. JAVA偏向锁的什么时候释放_​java偏向锁,你还没上车,它就要被去掉了
  6. linux 下 Apache自启动 配置方法
  7. 基于python+boostrap的学校图书馆管理系统
  8. AXure RP8 破解码
  9. python题目58:工厂流水线调度
  10. 蓝鸽集团云计算机,‎App Store 上的“蓝鸽教育云”
  11. 动态数组是怎么创建的?BQe
  12. 网页连接至数据库(asp->mdb)
  13. 概括TTL、RS32、RS485特点及区别
  14. Python从零到就业
  15. seamle***dp+rdesktop完美结合
  16. 怎么用python读取excel图_Python如何读取excel中的图片
  17. 计算机网络 - 数据链路层
  18. 求一个给定的n阶方阵的鞍点
  19. [附源码]Node.js计算机毕业设计大众点评管理系统Express
  20. seata xid是什么_html中的xid

热门文章

  1. ieee很多个作者都在一排上面的官方模版(作者栏简介大气)
  2. <<蜂鸟计划>>观后感
  3. 基于Mac自带nginx、php,配置php服务器
  4. 网络安全与机器学习(二):网络安全任务如何结合机器学习? 1
  5. undefined和null
  6. 承担集团数万应用、研发人员日常工作,阿里持续交付平台的设计、迭代之道...
  7. 银行业应对信息安全威胁高危的三大原则
  8. C# 生成编号的方法
  9. 黄哥漫谈Python 生成器
  10. 重写CListCtrl滚动条,遇到的问题。