一、pickle/Cpickle简介

  Python序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人。你会怎么做?这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到上次退出的地方。(实际上,很多非游戏程序也会这么干)在这种情况下,一个捕获了当前进度的数据结构需要在你退出的时候保存到硬盘上,接着在你重新启动的时候从硬盘上加载进来。
  Python标准库提供pickle和cPickle模块。cPickle是用C编码的,在运行效率上比pickle要高,但是cPickle模块中定义的类型不能被继承(其实大多数时候,我们不需要从这些类型中继承,推荐使用cPickle)。cPickle和pickle的序列化/反序列化规则是一样的,使用pickle序列化一个对象,可以使用cPickle来反序列化。同时,这两个模块在处理自引用类型时会变得更加“聪明”,它不会无限制的递归序列化自引用对象,对于同一对象的多次引用,它只会序列化一次。

  pickle模块中的两个主要函数是dump()和load()。dump()函数接受一个数据对象和一个文件句柄作为参数,把数据对象以特定的格式保存到给定的文件中。当我们使用load()函数从文件中取出已保存的对象时,pickle知道如何恢复这些对象到它们本来的格式。
  dumps()函数执行和dump()函数相同的序列化。取代接受流对象并将序列化后的数据保存到磁盘文件,这个函数简单的返回序列化的数据。
  loads()函数执行和load()函数一样的反序列化。取代接受一个流对象并去文件读取序列化后的数据,它接受包含序列化后的数据的str对象, 直接返回的对象。
  cPickle.dump(obj, file, protocol=0):序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。
      cPickle.load(file):反序列化对象。将文件中的数据解析为一个Python对象。python中可以使用pickle模块将对象转换为文件保存在磁盘上,在需要的时候再读取并还原。

二、pickle的具体用法

pickle.dump(obj,file[,protocol])

dump:是将对象持久化的方法,参数的含义分别为:

  1.obj:要持久化保存的对象,比如列表,字典或者是字符串
  2.file:一个拥有write()方法的对象,并且这个write()方法能接收一个字符串作为参数。这个对象可以是一个以写模式打开的文件对象或者一个StringIO对象,或者其他自定义的满足条件的对象
  3.protocol:这是一个可选的参数,默认为0,如果设置为1或True,则以高压缩的二进制格式保存持久化的对象,否则以ASCII格式保存。

  对象持久化后如何还原呢?使用load方法

 pickle.load(file)
  只有一个参数file,对应于上面dump方法中的file参数。这个file必须是一个拥有一个能接收一个整数为参数的read()方法以及一个不接收任何参数的readline()方法,并且这两个方法的返回值都应该是字符串。这可以是一个打开为读的文件对象、StringIO对象或其他任何满足条件的对象

三、具体实例

实例一:pickle.dump()和pickle.load()的简单应用

import pickle
obj = {'a':1,'b':2,'c':3}
pickle.dump(obj, open("tmp.txt",'w'))
obj2 = pickle.load(open("tmp.txt",'r'))
print obj2

程序执行结果:

{'a': 1, 'c': 3, 'b': 2}

实例二:将dump 第三个参数设为 True 以提高压缩比

不过实际应用中,我们可能还会有一些改进,比如用 cPickle 来代替 pickle ,前者是后者的一个 C 语言实现版本,拥有更快的速度,另外,有时在 dump 时也会将第三个参数设为 True 以提高压缩比

#_*_coding:utf-8_*_

import cPickle as pickle
import random
import os
import time
#设置循环的次数
LENGTH = 1024 * 1024 #随机生成1024 * 1024个0-255中间的整数
def main():
d = {}
a = []
for i in range(LENGTH):
a.append(random.randint(0, 255)) #将整个列表作为字典的value
d['a'] = a print "dumping..." #求字典对象存放到tmp1.dat文件中所需要的时间
#将dump的第三个参数设置为Ture,目的是提高压缩比
t1 = time.time()
pickle.dump(d, open("tmp1.dat", "wb"), True)
print "dump1: %.3fs" % (time.time() - t1) t1 = time.time()
pickle.dump(d, open("tmp2.dat", "w"))
print "dump2: %.3fs" % (time.time() - t1) #s1 s2文件的大小
s1 = os.stat("tmp1.dat").st_size
s2 = os.stat("tmp2.dat").st_size print "%d,%d,%.2f%%" %(s1,s2,100.0 * s1 / s2) print "loading....." #将字典对象加载到内存需要花费的时间
t1 = time.time()
obj1 = pickle.load(open("tmp1.dat", "rb"))
print "load1: %.3fs" % (time.time() - t1) t1 = time.time()
obj2 = pickle.load(open("tmp2.dat","r"))
print "load2: %.3fs" %(time.time() - t1) if __name__ == "__main__":
main()

程序执行结果:

dumping...
dump1: 0.106s
dump2: 0.476s
2099261,6890167,30.47%
loading.....
load1: 0.222s
load2: 0.870s

可以看到,dump 时如果指定了 protocol 为 True,压缩过后的文件的大小只有原来的文件的 30% ,同时无论在 dump 时还是 load 时所耗费的时间都比原来少。因此,一般来说,可以建议把这个值设为 True 。

实例三:pickle.dump() 和pickle.load()

  它们使用文件和类似文件的对象。这些函数的操作非常类似于我们刚才所看到的 dumps() 和 loads() ,区别在于它们还有另一种能力 — dump() 函数能一个接着一个地将几个对象转储到同一个文件。随后调用 load() 来以同样的顺序检索这些对象

import cPickle as pickle
a1 = 'apple'
b1 = {1:'one',2:'two',3:'three'}
c1 = ['free','fie','foe','fum'] with file('temp.pk1','wb') as f: pickle.dump(a1,f,True)
pickle.dump(b1,f,True)
pickle.dump(c1,f,True) with file('temp.pk1','rb') as f2:
a2 = pickle.load(f2)
print a2
b2 = pickle.load(f2)
print b2
c2 = pickle.load(f2)
print c2

程序执行结果:

apple
{1: 'one', 2: 'two', 3: 'three'}
['free', 'fie', 'foe', 'fum']

四、pickle.dumps()和pickle.loads()

  pickle 模块还提供 dumps 和 loads 两个方法,用法与上面的 dump 和 load 方法类似,只是不需要输入 file 参数,输入及输出都是字符串对象,有些场景中使用这两个方法可能更为方便。

参考文章:

http://www.cnblogs.com/evening/archive/2012/04/01/2427876.html

http://oldj.net/article/python-pickle/

python序列化pickle/cPickle的更多相关文章

  1. Python 序列化 pickle/cPickle模块

    Python 序列化 pickle/cPickle模块 2013-10-17 Posted by yeho Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给 ...

  2. Python 序列化pickle/cPickle模块整理

    Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人.你会怎么做?这取决于你想要怎么保存,怎么重用,发送给谁.很多游戏允许你在退出的时候保存进度,然后你再 ...

  3. Python序列化-pickle和json模块

    Python的“file-like object“就是一种鸭子类型.对真正的文件对象,它有一个read()方法,返回其内容.但是,许多对象,只要有read()方法,都被视为“file-like obj ...

  4. python 序列化 pickle shelve json configparser

    1. 什么是序列化 我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称 ...

  5. python 序列化pickle 和 encode的区别

    我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即un ...

  6. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  7. python 序列化之JSON和pickle详解

    JSON模块 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类 ...

  8. 从watevrCTF-2019:Pickle Store中学习python之pickle序列化漏洞

    从watevrCTF-2019:Pickle Store中学习python之pickle序列化漏洞 pickle提供了一个简单的持久化功能.可以将对象以文件的形式存放在磁盘上. 其本质是Picklin ...

  9. python 序列化 json pickle

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...

随机推荐

  1. word2vec初探(用python简单实现)

    为什么要用这个? 因为看论文和博客的时候很常见,不论是干嘛的,既然这么火,不妨试试. 如何安装 从网上爬数据下来 对数据进行过滤.分词 用word2vec进行近义词查找等操作 完整的工程传到了我的gi ...

  2. netty学习--handler传递

    在netty中的处理链pipeline中,事件是按顺序传递的,把自己拟人为netty程序,针对进来(inbound)的请求,会从head开始,依次往tail传递. pipeline采用了链表结构,he ...

  3. scrapy爬取全部知乎用户信息

    # -*- coding: utf-8 -*- # scrapy爬取全部知乎用户信息 # 1:是否遵守robbots_txt协议改为False # 2: 加入爬取所需的headers: user-ag ...

  4. vue-router动态路由 刷新页面 静态资源没有加载的原因

    在做项目的时候,发现刷新页面的时候,静态路由没有加载,度娘了一圈,终于解决了. vue-router使用history模式+使用嵌套路由: 访问路由和嵌套路由页面,显示正常,但是刷新页面的时候,嵌套路 ...

  5. mysql事务,视图,权限管理,索引,存储引擎(胖胖老师)

    1: 视图什么是视图    视图是一个虚拟表, 它的内容来源于查询的实表, 本身没有真正的数据;视图的作用    对于复杂的查询时,每次查询时都需要编写一些重复的查询代码让编写sql的效率低下, 为了 ...

  6. Spring官方文档翻译(转)

    http://blog.csdn.net/tangtong1/article/details/51326887 http://blog.csdn.net/tangtong1/article/detai ...

  7. day 1——ST表练习

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 43893   Accepted: 20585 ...

  8. TF-IDF In Scikit-Learn

    TF-IDF In Scikit-Learn 2017年9月30日补充   其实在算下面TF-IDF的步骤之前,还有一步,就是计算Term Frequency 也就是词频.当然,scikit-lear ...

  9. [UOJ 12]猜数

    Description

  10. codeforces round #419 C. Karen and Game

    C. Karen and Game time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...