Python模块学习:pickle/cPickle模块
正文
还记得我们在《Python零基础入门10天搞定》课程中介绍的泡菜模块吗?(吃货的本质已暴露)要是忘记了可以点击“阅读原文”再复习一下。
pickle介绍
在课程中介绍了Python中用于数据保存的pickle/cPickle模块,今天我们再来详细的介绍一下该模块。根据Python官方的文档介绍,pickle模块实现了一个基本的,但拥有强大序列化算法并序列化Python对象结构。“Pickling是将一个Python对象层次转换为字节流”的过程。
那么何为序列化呢?个人认为对象序列化是一个将任意复杂的对象转成对象的文本或二进制表示的过程。
另外pickle模块有一个更厉害的兄弟叫cPickle模块。顾名思义,cPickle是用C写的,所以它可以比pickle快1000倍。但是它不支持继承的pickler()和unpickler()类,因为在cPickle中这些是函数不是类。大多数应用程序不需要此功能,因此我们可以看到改进性能cPickle的优势。除此之外,这两个模块的接口几乎是相同的。下面中所叙述pickle模块不区分pickle或cPickle。
pickle的特点
pickle使用的数据格式是Python特有的。这样做的好处是,没有被外部强加的标准如XDR(不代表指针共享)限制;然而,这也意味着非Python程序可能无法重建pickle过的Python对象。
默认情况下,pickle的数据格式使用可打印ASCII表示形式。这比二进制表示稍大一些。使用可打印ASCII的最大优点是,一个人可以用标准文本编辑器读取被pickle的文件进行调试或恢复。
其次从空间和时间上说,pickle是可以移植的。换句话说,pickle 文件格式独立于机器的体系结构,这意味着,可以在 Linux 下创建一个 pickle,然后将它发送到在 Windows 或 Mac OS 下运行的 Python 程序。并且,当升级到更新版本的 Python 时,不必担心可能要废弃已有的 pickle。Python
开发人员已经保证 pickle 格式将可以向后兼容 Python 各个版本。
就好比腌泡菜的坛子是用Python自己的手法密封的,要是开启方式不对,自然无法取出泡菜。
pickle的使用
1 pickle.dump(obj, file)
把需要pickle的数据放入到文件当中。文件必须要有写的方法来接受字符串参数。例如:
#coding=utf-8
import cPickle as pickle
t1 = ('This is an example', 50, ['a', 'b', 'c'], True)
f = open('test.txt','wb')
p1 = pickle.dump(t1,f)
f.close()
test.txt里面的结果如下:
(S'This is an example'p1
I50
(lp2
S'a'aS'b'aS'c'aI01
tp3
.
2 pickle.load(file)
将pickle后的数据从文件当中读取出来并还原。文件可以采用两种方法来读取:read()方法需要一个整数参数;readline()方法不需要参数。例如:
#coding=utf-8
import cPickle as pickle
f = open('test.txt','rb')
p1 = pickle.load(f)
f.close()
还原后的结果如下:
('This is an example', 50, ['a', 'b', 'c'], True)
完美还原!
除了上面的两个方法外,还可以这样:
pickle.dumps(obj)
将对象序列化到内存(字符串格式保存),然后对象可以以任何方式处理如通过网络传输,而不是将其写入文件。
举例如下:
import cPickle as pickle
t1 = ('This is an example', 50, ['a', 'b', 'c'], True)
p1 = pickle.dumps(t1)
print p1
显示的结果如下:
(S'This is an example'p1
I50
(lp2
S'a'aS'b'aS'c'aI01
tp3
.
pickle.loads(obj)
将对象pickle后的对象转成字符串。
举例如下:
import cPickle as pickle
t2 = pickle.dumps(p1)
print t2
显示的结果如下:
('This is an example', 50, ['a', 'b', 'c'], True)
当我们dump()数据存在问题的时候如果产生错误,会产生pickle.PicklingError错误,这点要注意。
Unpickler是什么?
用于反序列化对象。参数file是一个类文件(file-like object)对象,Unpickler从该参数中获取数据进行反序列化。
它有一个方法叫做load( )。
反序列化对象。该方法会根据已经序列化的数据流,自动选择合适的反序列化模式。
举例如下:
import cPickle as pickle
t1 = ('This is an example', 50, ['a', 'b', 'c'], True)
fw = open('test.txt','wb')
pickle.dump(t1,fw)
fw.close()
fr = open('test.txt','rb')
unpick = pickle.Unpickler(fr)
print unpick.load()
fr.close()
显示的结果如下:
('This is an example', 50, ['a', 'b', 'c'], True)
那么哪些可以使用pickle/cPickle模块呢?
None, True, 和 False
整数,长整数,浮点数,复数
普通和Unicode字符串
元组,列表,集合,和只含picklable对象字典
在模块的顶层定义的函数
在模块的顶层的内置函数
在模块的顶层定义的类
dict或调用getstate()结果是picklable的实例(见详情pickle协议)。
举个例子吧!对于一个嵌套的类型,使用pickle序列化就失败,但是顶层的就成功了。例如:
import cPickle as pickle
class X(object):
class Y(object):
def __init__(self, name):
self.name = name
def __init__(self):
print 'init X'
b = X()
print 'b:',b
d = pickle.dumps(b, 0) #这个是成功的
print 'd pickled:',d
print pickle.loads(d)
显示的结果如下:
init X
b: <__main__.X object at 0x0246E810>
d pickled: ccopy_reg
_reconstructor
p1
(c__main__
X
p2
c__builtin__
object
p3
NtRp4
.
<__main__.X object at 0x0246E830>
再举个不成功的。
import cPickle as pickle
class X(object):
class Y(object):
def __init__(self, name):
self.name = name
def __init__(self):
print 'init X'
a = X.Y("This is Y")
print 'a:',a
c = pickle.dumps(a, 0) #error
print pickle.loads(c)
显示的结果如下:
a: <__main__.Y object at 0x0250E7D0>
Traceback (most recent call last):
File "C:UsersAdministratorDesktopnew 1.py", line 19, in <module>
c = pickle.dumps(a, 0) #error
cPickle.PicklingError: Can't pickle <class '__main__.Y'>: attribute lookup __mai
n__.Y failed
总结
本次我们介绍了pickle/cPickle模块的使用方法以及使用场景,注意消化吸收哦。
我们下次模块学习再见!
作业
最后为了检测一下今天的学习成果,布置一道题目。
在《Python网络编程基础篇》的课程当中,我们讲解了如何利用免费的天气API查询城市天气。那么请结合今天学习的成果,查询一个省份中各个城市的天气情况,例如安徽省各个城市的天气情况。可以考虑将省份和城市明细放在单独的txt文档中,需要查哪个省份调用就行了。考虑的时候一定要简单化,不要复杂,能实现功能即可,务必结合今天的学习内容。
具体的查询天气代码可以参考课程中的课件,或者贴吧中的代码,我会将心知天气城市列表也放到贴吧中供参考使用(其他天气的API仅供参考)。http://tieba.baidu.com/p/5147554458
欢迎大家将自己的作业提交给我,邮箱:xdbcb8@qq.com,我们在下周同一时间公布参考代码。
ps:上述程序在Python2.7.10环境调测;所有图片均来自互联网,所有权属于原作者。谢谢!

扩展阅读

python中MySQLdb模块用法实例
python中random模块用法实例
python操作日期和时间的方法
Python Math模块介绍
Python winsound 模块简介
Python 中的赋值与拷贝(copy)
更多资讯请关注:学点编程吧你私人的计算机学习顾问!
欢迎各位童鞋留言!
查看评论 回复