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

[email protected]:/mnt/hgfs/Python/day3$ python pickle_w.py 

[email protected]:/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

[email protected]:/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

[email protected]:/mnt/hgfs/Python/day3$ python pickle_w.py 

[email protected]:/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类似;

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

时间: 2024-10-12 09:27:10

python-Pickle序列化的相关文章

Python pickle序列化后写入文件,并实现曾加内容

pickle序列化 # _*_coding:utf-8_*_ import pickle import os list_ec = [] while True: if os.path.isfile("course_list"): # 判断文件夹是否存在 with open("course_list", "rb") as f: list_aa = pickle.load(f) f.close() # print(list_aa) # 可以打开,每次读

python pickle 序列化类

# coding:utf-8 try: import cPickle as pickle except ImportError: import pickle class PickleVar(object): __doc__ = '''序列化操作类''' def __init__(self): print ('------------------------------------------------------') def dump(self, data, fileName): with o

第九节:python pickle序列化、装饰器、模块

python个人笔记,纯属方便查询 中间退出的时候要保存,然后再次进入的时候还是退出的那个点. 字典-----字符串(硬盘)------字典 pickle语法dump: 把字典写入硬盘文件中: import pickle account_info = { 'a':'bbbbbbbbb', 'b':'ccccccccc' } f=file('account.pki','wb')         #定义一个二进制文件,只有字符串才能写入硬盘,所以字典要先转换为字符串. pickle.dump(acc

python 之序列化(pickle模块和json模块)

#!/usr/bin/env python # -*- coding: utf-8 -*- ''' 序列化(pickle)和json 1.什么是序列化? 序列化可以把一个对象(比如列表.字典都是对象),通过python特有的机制序列化一下. 也就是当作是以二进制的形式给它加密一下(特殊二进制的方式加密一下),这个过程就是序列化 并且对一个对象序列化(比如类.列表.字典)之后,可以进行反序列化. ''' import pickle,json li = ['tantianran',11,22,'ok

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

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

python对象序列化之pickle

本片文章主要是对pickle官网的阅读记录. The pickle module implements binary protocols for serializing and de-serializing a Python object structure. "Pickling" is the process whereby a Python object hierarchy is converted into a byte stream, and "unpickling&

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

1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,在python中.一个.py文件就称为一个模块(Module) 使用模块的好处: 提高了代码的可维护性. 其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们编写程序的时候也经常引用其他模块,包括python的内置的模块和第三方模块. 包(package

Python的json and pickle序列化

json序列化和json反序列化 #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' import json a = { "name":"test", "age":"20", } #json序列化 with open("json_test","w",encoding="utf-8") a

Python之路-json和pickle序列化/反序列化

首先引入json模块 序列化:使用json的dumps方法 反序列化:使用json的loads方法 过程:在json序列化后就可以将序列化的数据类型写入文件,然后在从文件中读出该数据类型,然后在进行反序列化 json对象中的其他的方法:dump(info,f)>>>其中Info是需要序列化的数据,f是一个文件句柄:load(f)>>>使用这两个方法不要在对文件进行读写 pickle和json使用方法类似,只是名字不同且pickle可以处理复杂数据类型而json不能(pi

[转]python pickle模块

持久性就是指保持对象,甚至在多次执行同一程序之间也保持对象.通过本文,您会对 Python对象的各种持久性机制(从关系数据库到 Python 的 pickle以及其它机制)有一个总体认识.另外,还会让您更深一步地了解Python 的对象序列化能力. 什么是持久性? 持久性的基本思想很简单.假定有一个 Python 程序,它可能是一个管理日常待办事项的程序,您希望在多次执行这个程序之间可以保存应用程序对象(待办事项).换句话说,您希望将对象存储在磁盘上,便于以后检索.这就是持久性.要达到这个目的,