Pickle模块数据对象持久化操作

Pickle模块的作用是持久化(序列化)的储存数据。
因此我先解释下:什么是序列化与反序列化、什么是对象序列化和对象反序列化。
通俗地讲,它们的定义如下:
序列化: 把一个对象保存到一个文件或数据库字段中去;
反序列化: 在适当的时候把这个文件再转化成原来的对象使用;
对象的序列化: 把对象转换为字节序列的过程;
对象的反序列化: 把字节序列恢复为对象的过程;

使用场合:
使用序列化主要是因为跨平台和对象存储的需求,因为网络上只允许字符串或者二进制格式,而文件需要使用二进制流格式。
如果想把一个内存中的对象存储下来就必须使用序列化转换为xml(字符串)、json(字符串)或二进制(流)等

注意: file.write/read操作的字符串对象,而pickle.dump/load操作的是结构化数据对象(如:列表、字典)。

常用接口:
(1) pickle.dump(obj, file, [,protocol])    #将obj对象序列化存入已经打开的file中。
     obj: 结构化对象
     file: 类文件对象(对象保存) 
    protocol: 序列化使用的协议版本。protocol默认值为0。
                  0:ASCII协议,所序列化的对象使用可打印的ASCII码表示;
                  1:老式的二进制协议;
                  2:2.3版本引入的新二进制协议,较以前的更高效
(2) pickle.load(file)                        # 将file中的对象序列化读出。
(3) pickle.dumps(obj[, protocol])   #以字节对象形式返回封装的对象,不需要写入文件中。
(4) pickle.loads(file)                      #从字节对象中读取被封装的对象,并返回。

dump能将多个对象序列化存储到同一个文件中,随后调用load()来以同样的顺序反序列化读出这些对象。

#pickle用法举例:  version: python 3.3.4
1.dump和load
>>> import pickle                           #导入pickle
>>> my_list = [‘ABC‘,‘123‘,‘中文‘,[‘123‘]]  #添加一个测试列表
>>> pickle_file = open(‘my_list.pkl‘,‘wb‘)  #文件(my_list.pkl)必须以二进制可写模式打开,即"wb"
>>> pickle.dump(my_list,pickle_file)        #调用pickle.dump方法,将my_list以二进制的方式写入pickle_file对象
>>> pickle_file.close()                     #关闭文件对象
>>> import os; os.getcwd()                  #引入os包,查看当前python目录
‘D:\\Python33‘
>>> os.listdir(‘D:\\Python33‘)              #查看指定目录下的文件,可以看到已经生成一个名为my_list.pkl的二进制文件
[... ‘my_list.pkl‘, .....]

>>> pickle_file2 = open(‘my_list.pkl‘,‘rb‘) #文件(my_list.pkl)必须以二进制可读模式打开,即"rb"
>>> my_list2 = pickle.load(pickle_file2)    #调用ickle.load方法,将以二进制格式保存的对象还原回来
>>> print (my_list2)
[‘ABC‘, ‘123‘, ‘中文‘, [‘123‘]]             #可以看出对象已经还原

#改进写法:
>>> import pickle
>>> my_list = [‘ABC‘,‘123‘,‘中文‘,[‘123‘]]
>>> with open(‘my_list.pkl‘,‘wb‘) as file1:  #采用with open as方式,不需要再调用close()
pickle.dump(my_list,file1)
>>> import os
>>> os.listdir(os.getcwd())
[... ‘my_list.pkl‘, .....]
>>> with open(‘my_list.pkl‘,‘rb‘) as file2:
new_list = pickle.load(file2)
>>> print (new_list)
[‘ABC‘, ‘123‘, ‘中文‘, [‘123‘]]

2.dumps和loads
#测试元组
>>> import pickle                 #导入pickle
>>> tuple1 = (‘A‘,1,‘小泉‘)       #添加一个元祖
>>> tuple1
(‘A‘, 1, ‘小泉‘)
>>> str1 = pickle.dumps(tuple1)   #以字节对象形式返回封装的对象,不需要写入文件中
>>> str2 = pickle.loads(str1)     #从字节对象中读取被封装的对象
>>> print (str2)
(‘A‘, 1, ‘小泉‘)
>>> type(str2)
<class ‘tuple‘>

#测试字符串
>>> str = ‘Hello World!‘
>>> import pickle
>>> str1 = pickle.dumps(str)
>>> str2 = pickle.loads(str1)
>>> print (str2)
Hello World!
>>> type(str)
<class ‘str‘>
>>> type(str2)
<class ‘str‘>

Pickle与CPickle对比
前者是完全用Python来实现的模块,这个CPickle是用C来实现的,它的速度要比pickle快好多倍。
一般建议如果电脑中只要有CPickle的话都应该使用它。

参考资料:
pickle模块的使用讲解: http://blog.csdn.net/coffee_cream/article/details/51754484

时间: 2024-10-26 15:36:17

Pickle模块数据对象持久化操作的相关文章

使用pickle模块存储对象

import time import hashlib import pickle import os class Info(): def __init__(self): self.create_time=time.time() def md5(self): m=hashlib.md5() m.update(str(self.create_time).encode('utf-8')) return m.hexdigest() def save(self): if not os.path.exist

python二次学习之二(第一天学到的一个重点pickle模块)

ython pickle模块作用是持久化的储存数据. 经常遇到在Python程序运行中得到了一些字符串.列表.字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据.python模块大全中的Pickle模块就派上用场了,它可以将对象转换为一种可以传输或存储的格式. 一.Pickle对象串行化 Pickle模块将任意一个Python对象转换成一系统字节的这个操作过程叫做串行化对象.二.Pickle与CPickle对比 前者是完全用Python来实现的模块,这个CPi

python json,pickle模块

json模块 不同语言间的数据交互 eval方法可以将一个字符串转成python对象,但eval方法是有局限性,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型(函数.类等)的时候,eval就不管用了,因此eval通常用来执行一个字符串表达式,并返回表达式的值. dic='{"name":"alex"}' f=open('hello','w') f.write(dic) #eval方法将字符串转换为python的数据类型 f_read=ope

JAVA笔记:Java数据库编程(四):处理大数据对象

大数据对象主要指的是CLOB和BLOB两种类型的字段,在CLOB中可以存储海量文字,例如存储一本小说.在BLOB中可以存储二进制文件,如电影,图片等,如果在程序中要处理大的数据对象,则必须使用PreparedStatement 完成,所有的内容要通过IO流的方式从大字段文本中保存和读取. 写入大数据对象的主要方法: 读取大数据对象的主要方法: 处理CLOB数据 CLOB表示大文本数据(Character Large Object),在MySQL中提供了LONGTEXT字段表示大文本数据,这个字段

Python数据对象的编码和解码,json和pickle模块,base64模块的简单使用

1.面向对象 对象:生活中的客观事物 类:对事物的抽象,在代码中实现class类型 类属性:这类事物具有的特点或者属性 类方法:这类事物具有的行为,可以实现的方法 实例:使用之前对类的实例化之后的结果 实例属性:对象具有的一些描述对象或者形容对象的属性,对象具体具有的特性 实例方法:对象具有的方法,行为动作 1.查看对象所拥有的方法 dir(对象) 例如 print(dir(列表))1.类中的实例(类)属性和方法命名风格 属性:名词 方法:动词 2.Python中万物皆对象 _对象名,对象私有化

python数据的存储和持久化操作

Python的数据持久化操作主要是六类:普通文件.DBM文件.Pickled对象存储.shelve对象存储.对象数据库存储.关系数据库存储. 普通文件不解释了,DBM就是把字符串的键值对存储在文件里: Python代码 % python >>> import anydbm >>> file = anydbm.open('movie', 'c') # make a DBM file called 'movie' >>> file['Batman'] =

[转]python数据持久存储:pickle模块的基本使用

python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象. 基本接口: pickle.dump(obj, file, [,protocol]) 注解:将对象obj保存到文件file中去. protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示:1:老式的二进制协议:2:2.3版本引

python数据持久存储:pickle模块的使用

python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象. 基本接口: pickle.dump(obj, file, [,protocol]) 注解:将对象obj保存到文件file中去. protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示:1:老式的二进制协议:2:2.3版本引

python数据持久存储:pickle模块的基本使用

参考 http://www.cnblogs.com/pzxbc/archive/2012/03/18/2404715.html python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象. 基本接口: pickle.dump(obj, file, [,protocol]) 注解:将对象obj保存到文件file中去. protoco