【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\nS'8908223631'\np1\n(lp2\nS'rachel'\np3\naI9000\naI9000\nasS'8906143632'\np4\n(lp5\nS'alex3714'\np6\naI15000\naI15000\nas."
>>> c = pickle.dumps(acc1)
>>> pickle.loads(c)
{'8908223631': ['rachel'90009000], '8906143632': ['alex3714'1500015000]}

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

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

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

python-Pickle序列化的更多相关文章

  1. python pickle 序列化类

    python pickle 序列化类 # coding:utf-8 try: import cPickle as pickle except ImportError: import pickle cl ...

  2. python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...

  3. Python的json and pickle序列化

    json序列化和json反序列化 #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' import json a = ...

  4. python pickle模块的使用/将python数据对象序列化保存到文件中

    # Python 使用pickle/cPickle模块进行数据的序列化 """Python序列化的概念很简单.内存里面有一个数据结构, 你希望将它保存下来,重用,或者发送 ...

  5. python 数据序列化(json、pickle、shelve)

    本来要查一下json系列化自定义对象的一个问题,然后发现这篇博客(https://www.cnblogs.com/yyds/p/6563608.html)很全面,感谢作者,关于python序列化的知识 ...

  6. python中序列化json模块和pickle模块

    内置模块和第三方模块 json模块和pickle 模块(序列化模块) 什么是序列化? 序列化就是将内粗这种的数据类型转成另一种格式 序列化:字典类型——>序列化——>其他格式——>存 ...

  7. python对象序列化之pickle

    本片文章主要是对pickle官网的阅读记录. The pickle module implements binary protocols for serializing and de-serializ ...

  8. python:序列化与反序列化(json、pickle、shelve)

    本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...

  9. (转)python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    阅读目录 1.1.1导入模块 1.1.2__name__ 1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代 ...

  10. 从watevrCTF-2019:Pickle Store中学习python之pickle序列化漏洞

    从watevrCTF-2019:Pickle Store中学习python之pickle序列化漏洞 pickle提供了一个简单的持久化功能.可以将对象以文件的形式存放在磁盘上. 其本质是Picklin ...

随机推荐

  1. C#操作xml的3种方式

    C#操作Xml有很多种方式,这里写出个人常使用的三种方式 XmlDocument DataSet linq to xml  首先声明本次操作使用的xml文件:books.xml:内容如下 <?x ...

  2. avi文件格式详解【转】

    AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于Microsoft Vide ...

  3. sublime text3入门笔记以及屏蔽sublime自动升级检测更新

    两个月前学习python的时候,有人推荐这个程序员最好用的编辑器,我下载了之后,发现比notepad++要好用很多,目前来说,网上成熟的版本是sublime text2简体中文版,插件也是很兼容,我用 ...

  4. 【Java】理解 UDDI 注册中心的 WSDL

    如何发布和查找 WSDL 服务描述 Web 服务描述语言(WSDL)有多种用法.特别是,根据应用程序的需要,WSDL 在 UDDI 注册中心有好几种使用方法.在这第 1 篇文章中(本系列共三篇),我们 ...

  5. Yaroslav and Divisors

    Codeforces Round #182 (Div. 1) D:http://codeforces.com/contest/301/problem/D 题意:给一个1-n,n个数的序列,然后查询一个 ...

  6. Struts2 cookie的存取

    /** * Cookieの追加 * @return * @throws Exception */ private void addCookie(String name,String value){ C ...

  7. Spark运行各个时间段的解释

    package org.apache.spark.ui private[spark] object ToolTips {  val SCHEDULER_DELAY =    ""& ...

  8. 模板:强连通分量&2-sat

    void Tarjan(int x){ low[x]=ID[x]=++tot; st[++top]=x;Inst[x]=true; for(int i=fir[x];i;i=nxt[i]) if(!I ...

  9. 【动态规划】Vijos P1121 马拦过河卒

    题目链接: https://vijos.org/p/1616 题目大意: 卒从(0,0)走到(n,m),只能向下或向右,不能被马一步碰到或走到马,有几种走法. 题目思路: [动态规划] 把马控制的地方 ...

  10. delphi NativeXml的中文支持 乱码

    一般XML的编码格式设置成UTF8比较通用,下面演示使用UTF8编码方式存储和处理包含中文的XML字符串(文件).1.设置启用内置的widestring支持 NativeXml内部使用ANSI str ...