首页 > 代码库 > 【python】pickle模块

【python】pickle模块

持久性的基本思想很简单。假定有一个 Python 程序,它可能是一个管理日常待办事项的程序,您希望在多次执行这个程序之间可以保存应用程序对象(待办事项)。换句话说,您希望将对象存储在磁盘上,便于以后检索。这就是持久性。要达到这个目的,有几种方法,每一种方法都有其优缺点。
例如,可以将对象数据存储在某种格式的文本文件中,譬如 CSV 文件。或者可以用关系数据库,譬如 Gadfly、MySQL、PostgreSQL 或者 DB2。这些文件格式和数据库都非常优秀,对于所有这些存储机制,Python 都有健壮的接口。
这些存储机制都有一个共同点:存储的数据是独立于对这些数据进行操作的对象和程序。这样做的好处是,数据可以作为共享的资源,供其它应用程序使用。缺点是,用这种方式,可以允许其它程序访问对象的数据,这违背了面向对象的封装性原则 — 即对象的数据只能通过这个对象自身的公共(public)接口来访问。
另外,对于某些应用程序,关系数据库方法可能不是很理想。尤其是,关系数据库不理解对象。相反,关系数据库会强行使用自己的类型系统和关系数据模型(表),每张表包含一组元组(行),每行包含具有固定数目的静态类型字段(列)。如果应用程序的对象模型不能够方便地转换到关系模型,那么在将对象映射到元组以及将元组映射回对象方面,会碰到一定难度。这种困难常被称为阻碍性不匹配(impedence-mismatch)问题。

 

序列化:dumps(object) 返回一个字符串,它包含一个 pickle 格式的对象。

    dump(object, file) 将对象写到文件,这个文件可以是实际的物理文件,但也可以是任何类似于文件的对象,这个对象具有 write() 方法,可以接受单个的字符串参数

 

反序列化: loads(string) 返回包含在 pickle 字符串中的对象

      load(file) 返回包含在 pickle 文件中的对象

清单1 :dumps() 和 loads() 的演示
  1. >>> import cPickle as pickle  
  2. >>> t1 = (‘this is a string‘, 42, [1, 2, 3], None)  
  • >>> t1  
  • (‘this is a string‘, 42, [1, 2, 3], None)  
  • >>> p1 = pickle.dumps(t1)  
  • >>> p1  
  • "(S‘this is a string‘/nI42/n(lp1/nI1/naI2/naI3/naNtp2/n."  
  • >>> print p1  
  • (S‘this is a string‘  
  • I42  
  • (lp1  
  • I1  
  • aI2  
  • aI3  
  • aNtp2  
  • .  
  • >>> t2 = pickle.loads(p1)  
  • >>> t2  
  • (‘this is a string‘, 42, [1, 2, 3], None)  
  • >>> p2 = pickle.dumps(t1, True)  
  • >>> p2  
  • ‘(U/x10this is a stringK*]q/x01(K/x01K/x02K/x03eNtq/x02.‘  
  • >>> t3 = pickle.loads(p2)  
  • >>> t3  
  • (‘this is a string‘, 42, [1, 2, 3], None)  

 

接下来,我们看一些示例,这些示例用到了 dump() 和 load() ,它们使用文件和类似文件的对象。这些函数的操作非常类似于我们刚才所看到的 dumps() 和 loads() ,区别在于它们还有另一种能力 — dump() 函数能一个接着一个地将几个对象转储到同一个文件。随后调用 load() 来以同样的顺序检索这些对象。清单 2 显示了这种能力的实际应用:

>>> a1 = ‘apple‘  >>> b1 = {1: ‘One‘, 2: ‘Two‘, 3: ‘Three‘}  >>> c1 = [‘fee‘, ‘fie‘, ‘foe‘, ‘fum‘]  >>> f1 = file(‘temp.pkl‘, ‘wb‘)  >>> pickle.dump(a1, f1, True)  >>> pickle.dump(b1, f1, True)  >>> pickle.dump(c1, f1, True)  >>> f1.close()  >>> f2 = file(‘temp.pkl‘, ‘rb‘)  >>> a2 = pickle.load(f2)  >>> a2  ‘apple‘  >>> b2 = pickle.load(f2)  >>> b2  {1: ‘One‘, 2: ‘Two‘, 3: ‘Three‘}  >>> c2 = pickle.load(f2)  >>> c2  [‘fee‘, ‘fie‘, ‘foe‘, ‘fum‘]  >>> f2.close() 

  

【python】pickle模块