zoukankan      html  css  js  c++  java
  • 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 显示了这种能力的实际应用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    >>> 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()

      

  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/zknublx/p/9104990.html
Copyright © 2011-2022 走看看