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' , 15000 , 15000 ], '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' , 9000 , 9000 ], '8906143632' : [ 'alex3714' , 15000 , 15000 ]} |
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' , 15000 , 15000 ], '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 1 , in <module> File "/usr/lib/python2.7/pickle.py" , line 1378 , in load return Unpickler(file).load() File "/usr/lib/python2.7/pickle.py" , line 858 , in load dispatch[key](self) File "/usr/lib/python2.7/pickle.py" , line 880 , in load_eof raise EOFError EOFError >>> acc1 { '8908223631' : [ 'rachel' , 9000 , 9000 ], '8906143632' : [ 'alex3714' , 15000 , 15000 ]} >>> acc2 { '8908223631' : [ 'xpleaf' , 9000 , 9000 ], '8906143632' : [ 'alex3714' , 15000 , 15000 ]} |
·可在一个文件中保存多个状态(dump),但是得一个一个地调取状态(load),不建议这样做;
2.Pickle的其它说明与使用
·序列化使得不同程序之间可以交互数据的读取;
·Pickle中的dump()只能将数据结构的序列化存储在磁盘中,然后load()再通过反序列化调用磁盘的相关文件;
·使用Pickle的dumps()与loads()则可以直接在内存中操作:
1
2
3
4
5
6
7
|
>>> acc1 { '8908223631' : [ 'rachel' , 9000 , 9000 ], '8906143632' : [ 'alex3714' , 15000 , 15000 ]} >>> 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' , 9000 , 9000 ], '8906143632' : [ 'alex3714' , 15000 , 15000 ]} |
·只需提供操作接口即可实现动态地交互程序的状态(游戏进度切换的例子,P1--P2,P1实时将游戏进度交给P2);
·与Pickle有同样重要的是json,用法与Pickle类似;
·序列化的思想对于不同平台和不同编程语言的数据结构交互有着重要的作用,由于未深入学习,这里不作说明。
python-Pickle序列化的更多相关文章
- python pickle 序列化类
python pickle 序列化类 # coding:utf-8 try: import cPickle as pickle except ImportError: import pickle cl ...
- python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)
1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...
- Python的json and pickle序列化
json序列化和json反序列化 #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' import json a = ...
- python pickle模块的使用/将python数据对象序列化保存到文件中
# Python 使用pickle/cPickle模块进行数据的序列化 """Python序列化的概念很简单.内存里面有一个数据结构, 你希望将它保存下来,重用,或者发送 ...
- python 数据序列化(json、pickle、shelve)
本来要查一下json系列化自定义对象的一个问题,然后发现这篇博客(https://www.cnblogs.com/yyds/p/6563608.html)很全面,感谢作者,关于python序列化的知识 ...
- python中序列化json模块和pickle模块
内置模块和第三方模块 json模块和pickle 模块(序列化模块) 什么是序列化? 序列化就是将内粗这种的数据类型转成另一种格式 序列化:字典类型——>序列化——>其他格式——>存 ...
- python对象序列化之pickle
本片文章主要是对pickle官网的阅读记录. The pickle module implements binary protocols for serializing and de-serializ ...
- python:序列化与反序列化(json、pickle、shelve)
本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...
- (转)python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)
阅读目录 1.1.1导入模块 1.1.2__name__ 1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代 ...
- 从watevrCTF-2019:Pickle Store中学习python之pickle序列化漏洞
从watevrCTF-2019:Pickle Store中学习python之pickle序列化漏洞 pickle提供了一个简单的持久化功能.可以将对象以文件的形式存放在磁盘上. 其本质是Picklin ...
随机推荐
- 关于system(”pause“);的作用和意义
注意:不要再return 的语句之后加,那样就执行不到了. system() 是调用系统命令:pause 暂停命令: 如果加有 system(”pause“): 这样在运行到此处时,会显示“Pres ...
- sql语句中出现笛卡尔乘积
没有join条件导致笛卡尔乘积 学过线性代数的人都知道,笛卡尔乘积通俗的说,就是两个集合中的每一个成员,都与对方集合中的任意一个成员有关联.可以想象,在SQL查询中,如果对两张表join查询而没有jo ...
- 安装 mysql server
三个月前向公司申请了一台服务器单独给我用,作为部署我写的自动发布工具的服务器.同事不久前在我这台服务器上装了个数据库,今天上去查了一下,用不了,只有information_schema和test两个数 ...
- 源代码安装GIT
参考URL:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=25150840&id=4250659 若是条件允许,从源代 ...
- mysql安装2
linux下安装mysql-5.1.51.tar.gz (2010-10-27 10:59:26) 转载▼ 标签: mysql 数据库 tar.gz安装 杂谈 分类: Mysql数据库 MySQL h ...
- -_-#【jQuery插件】textSlider 文本滚动
jQuery.textSlider.js ;(function($) { $.fn.textSlider = function(settings) { settings = jQuery.extend ...
- 贪心:SPOJ Backup Files
BACKUP - Backup Files no tags You run an IT company that backs up computer data for large offices. ...
- 【数论】【扩展欧几里得】Codeforces 710D Two Arithmetic Progressions
题目链接: http://codeforces.com/problemset/problem/710/D 题目大意: 两个等差数列a1x+b1和a2x+b2,求L到R区间内重叠的点有几个. 0 < ...
- poj 2408 Apple Tree
http://poj.org/problem?id=2486 典型的回溯题目:特别是状态方程用三维的来标记是否要走回路. 题意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走 ...
- ie中弹出框中元素的定位
用selenium在ie8浏览器中定位一个弹出框时,直接用ie developer tools可能不一定能定位到,有一个解决的办法是直接在url后面加上#noHide,刷新后,然后再用ie devel ...