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

简介:

说明:关于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类似;

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




本文转自 xpleaf 51CTO博客,原文链接:http://blog.51cto.com/xpleaf/1697298,如需转载请自行联系原作者

相关文章
|
4月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
105 1
|
5月前
|
存储 JSON 数据格式
Python 输入输出与文件处理: io、pickle、json、csv、os.path 模块详解
Python 输入输出与文件处理: io、pickle、json、csv、os.path 模块详解
70 0
|
7月前
|
存储 Python
dill:Python中增强版的pickle
dill:Python中增强版的pickle
187 4
|
7月前
|
存储 JSON JavaScript
python序列化: json & pickle & shelve 模块
python序列化: json & pickle & shelve 模块
|
6月前
|
JSON 安全 数据格式
7-6|python报错TypeError: can't pickle _thread.RLock objects
7-6|python报错TypeError: can't pickle _thread.RLock objects
|
6月前
|
JSON 数据格式
序列化 json和pickle
序列化 json和pickle
|
7月前
|
存储 算法 Python
【Leetcode刷题Python】297. 二叉树的序列化与反序列化
LeetCode第297题"二叉树的序列化与反序列化"的Python语言解决方案,包括序列化二叉树为字符串和反序列化字符串为二叉树的算法实现。
37 5
|
7月前
|
JSON 缓存 安全
Python pickle 二进制序列化和反序列化 - 数据持久化
Python pickle 二进制序列化和反序列化 - 数据持久化
96 0
|
9月前
|
JSON 安全 数据格式
详解python pickle中的反序列化漏洞
今天我们来聊聊Python里的反序列化攻击。先来看看什么是序列化和反序列化。简单来说,序列化就是把数据结构转换成字节流,这样我们就可以把数据保存到文件里或者通过网络传输。反序列化则是把这些字节流再转换回原来的数据结构。 在Python里,常用的模块之一就是Pickle。它可以帮我们很方便地进行序列化和反序列化操作。比如,你可以把一个复杂的Python对象序列化保存下来,等需要用的时候再反序列化回来。 反序列化攻击的概述 反序列化过程有漏洞:如果我们反序列化了一个不可信的数据源,那就可能引发反序列化攻击。攻击者可以在序列化的数据里嵌入恶意代码,当你反序列化这个数据时,这些恶意代码就会被执
|
10月前
|
存储 编解码 Python
初出茅庐,python模块篇:pickle模块和pathlib模块(太过详细,篇幅较长)_python文件操作模块有pickle模块
初出茅庐,python模块篇:pickle模块和pathlib模块(太过详细,篇幅较长)_python文件操作模块有pickle模块

热门文章

最新文章