• python-Pickle序列化


    【Python之旅】第三篇(二):Pickle序列化

     

    python 序列化 pickle

    摘要: 说明:关于Pickle的说明     作如下说明: 1 2 3 4 5 6 7 序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人。你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的时候保存进度,然后你再次启动的时候...

    说明:关于Pickle的说明

        作如下说明:

    1
    2
    3
    4
    5
    6
    7
    序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人。你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到上次退出的地方。(实际上, 很多非游戏程序也会这么干。) 在这个情况下, 一个捕获了当前进度的数据结构需要在你退出的时候保存到磁盘上,接着在你重新启动的时候从磁盘上加载进来。
     
    什么东西能用pickle模块存储?
    –所有Python支持的 原生类型 : 布尔, 整数, 浮点数, 复数, 字符串, bytes(字节串)对象, 字节数组, 以及 None.
    –由任何原生类型组成的列表,元组,字典
    –由任何原生类型组成的列表,元组,字典和集合组成的列表,元组,字典和集合(可以一直嵌套下去,直至Python支持的最大递归层数).
    –函数,类,和类的实例(带警告)。

    1.Pickle的简单介绍与使用

    ·简单说明如下:

    a.字典的数据结构在内存中存储,保存为文件无法识别,如果要保存,并在下一次打开时还能用,需要做Pickle序列化存储;

    b.读取时需要反序列化;

    c.pickle可以把程序的执行进度都保存下来;

    ·给出实例1:Pickle只保存一种状态

    a.存储序列化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/env python
     
    import pickle
    account_info = {
    '8906143632':['alex3714'1500015000],
    '8908223631':['rachel'9000,9000]
    }
     
    f=file('account.pkl','wb')
    pickle.dump(account_info,f)
    f.close()

    b.读取序列化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/env python
     
    import pickle
     
    pkl_file = file('account.pkl','rb')
    account_list = pickle.load(pkl_file)
    pkl_file.close()
     
    print account_list

    c.执行结果如下:

    1
    2
    3
    xpleaf@xpleaf-machine:/mnt/hgfs/Python/day3$ python pickle_w.py 
    xpleaf@xpleaf-machine:/mnt/hgfs/Python/day3$ python pickle_r.py 
    {'8908223631': ['rachel'90009000], '8906143632': ['alex3714'1500015000]}

    d.生成的account.pkl中保存了字典的状态:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    xpleaf@xpleaf-machine:/mnt/hgfs/Python/day3$ cat account.pkl 
    (dp0
    S'8908223631'
    p1
    (lp2
    S'rachel'
    p3
    aI9000
    aI9000
    asS'8906143632'
    p4
    (lp5
    S'alex3714'
    p6
    aI15000
    aI15000
    as.

    ·实例2:Pickle保存多种状态

    a.存储序列化代码修改为如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/env python
     
    import pickle
    account_info = {
    '8906143632':['alex3714'1500015000],
    '8908223631':['rachel'9000,9000]
    }
     
    f=file('account.pkl','wb')
    pickle.dump(account_info,f)    #第一次状态保存
    account_info['8908223631'][0] = 'xpleaf'    #修改字典中的某项内容
    pickle.dump(account_info,f)    #第二次状态保存
    f.close()

    b.执行存储序列化程序,使两次状态保存到文件中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    xpleaf@xpleaf-machine:/mnt/hgfs/Python/day3$ python pickle_w.py 
    xpleaf@xpleaf-machine:/mnt/hgfs/Python/day3$ cat account.pkl 
    (dp0
    S'8908223631'
    p1
    (lp2
    S'rachel'
    p3
    aI9000
    aI9000
    asS'8906143632'
    p4
    (lp5
    S'alex3714'
    p6
    aI15000
    aI15000
    as.(dp0
    S'8908223631'
    p1
    (lp2
    S'xpleaf'    #对比只保存一次状态的情况,这里多了修改的内容'xpleaf'
    p3
    aI9000
    aI9000
    asS'8906143632'
    p4
    (lp5
    S'alex3714'
    p6
    aI15000
    aI15000
    as.

    c.在交互器中测试:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    >>> import pickle
    >>> f = file('account.pkl')
    >>> acc1 = pickle.load(f)    #反序列化读取第一次状态的内容
    >>> acc2 = pickle.load(f)    #反序列化读取第二次状态的内容
    >>> acc3 = pickle.load(f)    #无第三次状态内容,读取失败
    Traceback (most recent call last):
      File "<stdin>", line 1in <module>
      File "/usr/lib/python2.7/pickle.py", line 1378in load
        return Unpickler(file).load()
      File "/usr/lib/python2.7/pickle.py", line 858in load
        dispatch[key](self)
      File "/usr/lib/python2.7/pickle.py", line 880in load_eof
        raise EOFError
    EOFError
    >>> acc1
    {'8908223631': ['rachel'90009000], '8906143632': ['alex3714'1500015000]}
    >>> acc2
    {'8908223631': ['xpleaf'90009000], '8906143632': ['alex3714'1500015000]}

    ·可在一个文件中保存多个状态(dump),但是得一个一个地调取状态(load),不建议这样做;


    2.Pickle的其它说明与使用

    ·序列化使得不同程序之间可以交互数据的读取;

    ·Pickle中的dump()只能将数据结构的序列化存储在磁盘中,然后load()再通过反序列化调用磁盘的相关文件;

    ·使用Pickle的dumps()与loads()则可以直接在内存中操作:

    1
    2
    3
    4
    5
    6
    7
    >>> acc1
    {'8908223631': ['rachel'90009000], '8906143632': ['alex3714'1500015000]}
    >>> pickle.dumps(acc1)
    "(dp0 S'8908223631' p1 (lp2 S'rachel' p3 aI9000 aI9000 asS'8906143632' p4 (lp5 S'alex3714' p6 aI15000 aI15000 as."
    >>> c = pickle.dumps(acc1)
    >>> pickle.loads(c)
    {'8908223631': ['rachel'90009000], '8906143632': ['alex3714'1500015000]}

    ·只需提供操作接口即可实现动态地交互程序的状态(游戏进度切换的例子,P1--P2,P1实时将游戏进度交给P2);

    ·与Pickle有同样重要的是json,用法与Pickle类似;

    ·序列化的思想对于不同平台和不同编程语言的数据结构交互有着重要的作用,由于未深入学习,这里不作说明。

  • 相关阅读:
    sublime text3 安装SublimeCodeIntel插件
    进入博客园的第一天
    .NET之Hangfire快速入门和使用
    图片相似性 d-hash算法 C#实践
    同一个Docker swarm集群中部署多版本的测试环境
    C#创建单链表,翻转单链表
    halcon例程学习 一维测量之矩形边缘
    halcon例程学习 一维测量之弧形边缘
    python 圆曲线
    python pygame黑客帝国的简单实现
  • 原文地址:https://www.cnblogs.com/weiman3389/p/6044926.html
Copyright © 2020-2023  润新知