Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->Linux程序设计 ->正文

Linux编程之序列化存储Python对象(上)

来源: 作者: 时间:2007-04-11 点击: [收藏] [投稿]





一些经过 pickle 的 Python

pickle 模块及其同类模块 cPickle 向 Python 提供了 pickle 支持。后者是用 C 编码的,它具有更好的性能,对于大多数应用程序,推荐使用该模块。我们把继续讨论 pickle,但本文的示例实际是利用了 cPickle。由于其中大多数示例要用 Python shell 来显示,所以先展示一下怎么样导入 cPickle,并可以作为 pickle 来引用它:

  >>> import cPickle as pickle
 

现在已经导入了该模块,接下来让我们看一下 pickle 接口。pickle 模块提供了以下函数对:dumps(object) 返回一个字符串,它包含一个 pickle 格式的对象;loads(string) 返回包含在 pickle 字符串中的对象;dump(object, file) 把对象写到文件,这个文件可以是实际的物理文件,但也可以是任何类似于文件的对象,这个对象具有 write() 方法,可以接受单个的字符串参数;load(file) 返回包含在 pickle 文件中的对象。

缺省情况下,dumps() 和 dump() 使用可打印的 ASCII 表示来创建 pickle。两者都有一个 final 参数(可选),如果为 True,则该参数指定用更快以及更小的二进制表示来创建 pickle。loads() 和 load() 函数自动检测 pickle 是二进制格式还是文本格式。

清单 1 显示了一个交互式会话,这里使用了刚才所描述的 dumps() 和 loads() 函数:

  Welcome To PyCrust 0.7.2 - The Flakiest Python Shell
  Sponsored by Orbtech - Your source for Python programming expertise.
  Python 2.2.1 (#1, Aug 27 2002, 10:22:32)
  [GCC 3.2 (Mandrake Linux 9.0 3.2-1mdk)] on linux-i386
  Type "copyright", "credits" or "license" for more information.
  >>> import cPickle as pickle
  >>> 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)
  

清单 1. dumps() 和 loads() 的演示

注:该文本 pickle 格式很简单,这里就不解释了。事实上,在 pickle 模块中记录了所有使用的约定。我们还应该指出,在我们的示例中使用的都是简单对象,因此使用二进制 pickle 格式不会在节省空间上显示出太大的效率。然而,在实际使用复杂对象的系统中,您会看到,使用二进制格式可以在大小和速度方面带来显著的改进。

接下来,我们看一些示例,这些示例用到了 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()
  
  

清单 2. dump() 和 load() 示例


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Linux编程:把PHP作为Shell脚本使用   下一篇:Linux编程之序列化存储Python对象(下)

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号