返回宝典

对象持久化

上一节 下一节

使用python的内置模块pickle可以将python中指定对象转化为文件保存在磁盘上,以后再取出读取。模块pickle的实质是python数据结构的序列化与反序列化。


pickle模块

如下所示,data是一个用来测试的python对象,内容随意;可通过pickle.dump方法将data对象持久化到指定文件data.pkl中去。

import pickle

data = { 'key1': [6,6,6],
         'key2': ('zhuan', 'fou'),
         'key3': True }
file = open('data.pkl', 'wb')
pickle.dump(data, file) # 将对象data持久化到file文件对象
file.close()


以后,要想再从data.pkl文件中读取出data对象,只需使用pickle模块来加载该文件即可:

import pickle

file = open('data.pkl', 'rb') # 与pickle后的数据连接
data = pickle.load( file ) # 把它加载进一个变量
print data
file.close()

优化

实际应用中,有如下两点可进行优化:

  • 使用内置模块cPickle替代pickle,cPickle是pickle的C语言实现版本,速度更快
  • 使用dump方法进行pickle处理时,将其第三个形参设成True,可获得更高的压缩比。

基于上述两点,对代码进行优化,如下所示:

import cPickle as pickle

data = { 'key1': [6,6,6],
         'key2': ('zhuan', 'fou'),
         'key3': True }
file = open('data.pkl', 'wb')
pickle.dump(data, file, True) # 第三个形参设成True获得更高压缩比
file.close()


从文件加载对象,只需换成cPickle模块,其余照旧:

import cPickle as pickle

file = open('data.pkl', 'rb') # 与pickle后的数据连接
data = pickle.load( file ) # 把它加载进一个变量
print data
file.close()

警示

用纯文本来存储重要数据很容易遭到破坏和修改,pickle虽然对这类问题有效;但是pickle并不完美,依然有可能被破坏、修改、恶意利用。此外pickle不支持跨python版本,因此pickle持久化的对象并不适合公共使用。不过,pickle本身的定位也不在于此。


函数也是对象,也可以使用pickle进行对象持久化。


对象持久化

上一节 下一节