建议44:理解模块pickle优劣
# -*- coding:utf-8 -*- ''' pickle 估计是最通用的序列化模块了,它还有个C 语言的实现cPickle,相比pickle 来说 具有较好的性能,其速度大概是pickle 的1000 倍,因此在大多数应用程序中应该优先使用 cPickle(注:cPickle 除了不能被继承之外,它们两者的使用基本上区别不大,除有特殊情况, 本节将不再做具体区分)。pickle 中最主要的两个函数对为dump() 和load(),分别用来进行对 象的序列化和反序列化。 pickle.dump(obj, file[, protocol]) :序列化数据到一个文件描述符(一个打开的文件、 套接字等)。参数obj 表示需要序列化的对象,包括布尔、数字、字符串、字节数组、 None、列表、元组、字典和集合等基本数据类型,此外picike 还能够处理循环,递归 引用对象、类、函数以及类的实例等。参数file 支持write() 方法的文件句柄,可以为 真实的文件,也可以是StringIO 对象等。protocol 为序列化使用的协议版本,0 表示 ASCII 协议,所序列化的对象使用可打印的ASCII 码表示;1 表示老式的二进制协议; 2 表示2.3 版本引入的新二进制协议,比以前的更高效。其中协议0 和1 兼容老版本 的Python。protocol 默认值为0。 load(file):表示把文件中的对象恢复为原来的对象,这个过程也被称为反序列化。 来看一下load() 和dump() 的示例。 ''' import cPickle as pickle my_data = {"name" : "Python", "type" : "Language", "version" : "2.7.5"} fp = open("picklefile.dat", "wb") # 打开要写入的文件 pickle.dump(my_data, fp) # 使用dump 进行序列化 fp.close() fp = open("picklefile.dat", "rb") out = pickle.load(fp) # 反序列化 fp.close() #通用做法如下 with open("picklefile.dat", "rb") as fp: try: lastfileList = pickle.load(fp) except EOFError: print "Load (filename) was failed"%{'filename':'picklefile.dat'}
学无止境