• 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()

      

  • 相关阅读:
    静态库介绍与简单演练及同名资源冲突解决(.a格式的静态库)
    获取在线APP的素材图片
    屏幕适配-预览工具的使用
    Mac本“安全性与隐私”里没有“任何来源”选项
    SVN(Cornerstone)-添加忽略文件
    应用间跳转
    清花瓷抓包手机配置
    生成iOSAPP的二维码
    iOS上架90034问题解决
    正则表达式
  • 原文地址:https://www.cnblogs.com/zknublx/p/9104990.html
Copyright © 2020-2023  润新知