使用pickle模块

如果想要保存一些结果或者数据以方便后续使用,Python 中的pickle 模块非常有用。pickle 模块可以接受几乎所有的Python 对象,并且将其转换成字符串表示,该过程叫做封装(pickling)。从字符串表示中重构该对象,称为拆封(unpickling)。这些字符串表示可以方便地存储和传输。

我们来看一个例子。假设想要保存上一节字体图像的平均图像和主成分,可以这样来完成:
# 保存均值和主成分数据
f = open('font_pca_modes.pkl', 'wb')
pickle.dump(immean,f)
pickle.dump(V,f)
f.close()

在上述例子中,许多对象可以保存到同一个文件中。pickle 模块中有很多不同的协议可以生成.pkl 文件;如果不确定的话,最好以二进制文件的形式读取和写入。在其他Python 会话中载入数据,只需要如下使用load() 方法:
# 载入均值和主成分数据
f = open('font_pca_modes.pkl', 'rb')
immean = pickle.load(f)
V = pickle.load(f)
f.close()

注意,载入对象的顺序必须和先前保存的一样。Python 中有个用C语言写的优化版本,叫做cpickle 模块,该模块和标准pickle 模块完全兼容。关于pickle 模块的更多内容,参见pickle 模块文档页http://docs.python.org/library/pickle.html。

在本书接下来的章节中,我们将使用with 语句处理文件的读写操作。这是Python 2.5 引入的思想,可以自动打开和关闭文件(即使在文件打开时发生错误)。下面的例子使用with() 来实现保存和载入操作:
# 打开文件并保存
with open('font_pca_modes.pkl', 'wb') as f:
pickle.dump(immean,f)
pickle.dump(V,f)

# 打开文件并载入
with open('font_pca_modes.pkl', 'rb') as f:
immean = pickle.load(f)
V = pickle.load(f)

上面的例子乍看起来可能很奇怪,但with() 确实是个很有用的思想。如果你不喜欢它,可以使用之前的open 和close 函数。

作为pickle 的一种替代方式,NumPy 具有读写文本文件的简单函数。如果数据中不包含复杂的数据结构,比如在一幅图像上点击的点列表,NumPy 的读写函数会很有用。保存一个数组x 到文件中,可以使用:
savetxt('test.txt',x,'%i')

最后一个参数表示应该使用整数格式。类似地,读取可以使用:
x = loadtxt('test.txt')

你可以从在线文档http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt. html 了解更多内容。

最后,NumPy 有专门用于保存和载入数组的函数。你可以在上面的在线文档里查看关于save() 和load() 的更多内容。

展开阅读全文

没有更多推荐了,返回首页