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

本文介绍了Python的Pickle模块,用于序列化和反序列化数据结构,包括基本类型、复杂结构如列表、字典等。Pickle允许在程序运行时保存和加载数据,便于数据持久化和跨程序交互。示例展示了如何使用Pickle进行序列化存储和读取,以及在内存中直接操作序列化数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:关于Pickle的说明

作如下说明:序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人。你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到上次退出的地方。(实际上, 很多非游戏程序也会这么干。) 在这个情况下, 一个捕获了当前进度的数据结构需要在你退出的时候保存到磁盘上,接着在你重新启动的时候从磁盘上加载进来。

什么东西能用pickle模块存储?

–所有Python支持的 原生类型 : 布尔, 整数, 浮点数, 复数, 字符串, bytes(字节串)对象, 字节数组, 以及 None.

–由任何原生类型组成的列表,元组,字典

–由任何原生类型组成的列表,元组,字典和集合组成的列表,元组,字典和集合(可以一直嵌套下去,直至Python支持的最大递归层数).

–函数,类,和类的实例(带警告)。

1.Pickle的简单介绍与使用

·简单说明如下:

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

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

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

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

a.存储序列化#!/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.读取序列化#!/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.执行结果如下: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中保存了字典的状态: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.存储序列化代码修改为如下:#!/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.执行存储序列化程序,使两次状态保存到文件中: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.在交互器中测试:>>> import pickle

>>> f = file('account.pkl')

>>> acc1 = pickle.load(f)    #反序列化读取第一次状态的内容

>>> acc2 = pickle.load(f)    #反序列化读取第二次状态的内容

>>> acc3 = pickle.load(f)    #无第三次状态内容,读取失败

Traceback (most recent call last):

File "", line 1, in 

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()则可以直接在内存中操作:>>> 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类似;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值