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

说明:关于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.执行结果如下:

[email protected]:/mnt/hgfs/Python/day3$ python pickle_w.py 
[email protected]:/mnt/hgfs/Python/day3$ python pickle_r.py 
{‘8908223631‘: [‘rachel‘, 9000, 9000], ‘8906143632‘: [‘alex3714‘, 15000, 15000]}

d.生成的account.pkl中保存了字典的状态:

[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.存储序列化代码修改为如下:

#!/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.执行存储序列化程序,使两次状态保存到文件中:

[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.在交互器中测试:

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

>>> 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类似;

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

时间: 2024-12-21 12:47:56

【Python之旅】第三篇(二):Pickle序列化的相关文章

Objective-C学习之旅 第三篇

Objective-C学习之旅 第三篇 Objective-C 类声明,定义,实例,初始化 类声明 //类声明的编译处理指令以@interface开始,以@end结尾,在这之间代码便是类变量的定义和方法的声明. //类的声明和定义比其他语言复杂,这会让刚开始学习Objective-C的人非常困惑 //准确的说,其他语言如Java只需定义类而不用声明,而Objective-C需要先声明再定义. @interface 类名 : 父类名 { 声明成员变量 ... } 声明方法 @end 实例: @in

python 跨语言数据交互,json,pickle(序列化).

Python中用于序列化的两个模块 json     用于[字符串]和 [python基本数据类型] 间进行转换 pickle   用于[python特有的类型] 和 [python基本数据类型]间进行转换 Json模块提供了四个功能:dumps.dump.loads.load pickle模块提供了四个功能:dumps.dump.loads.load json.dudmp ("[11,22]",open('db.txt','w'))   #转换成字符串再保存到该文件. json.lo

【Python之旅】第二篇(三):基于列表处理的购物清单程序

1.基本需求 编写一个购物小程序,要求实现如下功能: (1)让用户输入工资: (2)输出购物菜单及产品价格: (3)计算用户是否可支付: (4)输出用户剩余的钱,问用户是否继续购物,如果选择继续,则继续进行,否则退出程序: (5)若钱不够,输出用户还需要工作多久才能买得起(这里暂不实现此功能). 2.实现基本思路 基本思路可如下所示: 在编写程序的时候即以该思路为主线,具体细节下面再提及. 3.实现细节 基于友好用户界面的原则,实现的细节可总结如下: (1)用户输入工资时,如果输入的是非数字或没

python之路第三篇

python文件目录操作 python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删除多个目录:os.removedirs(r“c:\python”) 检验给出的路径是否是一个文件:os.path.isfile() 检验给出的路径是否是一个目录:os.path.isdir()

Python开发【第三篇】:函数&amp;读写文件

三元运算 三元运算,是条件语句的简单的写法.如果条件为真,则返回值1,否则,返回值2. ret = 值1 if 条件 else 值2 深浅拷贝 对于数字(int)和字符串(str)而言,赋值.深拷贝.浅拷贝都无意义,因为内存地址指向同一个. import copy # ######### 数字.字符串 ######### n1 = 123 # n1 = "i am a student" print(id(n1)) # ## 赋值 ## n2 = n1 print(id(n2)) # #

Python之旅.第三章.函数3.28

一.命名关键字参数: 什么是命名关键字参数?格式:在*后面参数都是命名关键字参数特点:1 必须被传值1 约束函数的调用者必须按照key=value的形式传值2 约束函数的调用者必须用我们指定的key名 def foo(x,y,*,z): #创建foo函数,z为命名关键字参数 print(x,y,z)#foo(1,2,aaa=3) #报错,z为命名关键字参数,只能用用关键字z=值foo(1,2,z=3) ------------------------------def auth(*args,na

Python之旅.第三章.函数3.30

一.迭代器 1.什么是迭代?:迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来 2.要想了解迭代器到底是什么?必须先了解一个概念,即什么是可迭代的对象?可迭代的对象:在python中,但凡内置有__iter__方法的对象,都是可迭代的对象num=1 以下都是可迭代的对象str1='hello'list1=[1,2,3]tup1=(1,2,3)dic={'x':1}s1={'a','b','c'}f=open('a.txt','w',encoding='utf-8') 3.迭代器:迭代取

Python 学习日记第三篇 -- 字典

一.字典 python中的字典不是序列,而是一种映射:不通过位置而是通过键存储.字典是可变的. 1.字典的映射操作 使用{}定义字典,以key:value形式存储数据,在字典中key是唯一的 >>> one_dict = {'name':"jym",'age':23,'addr':'xinjiang'} #通过key查找数据 >>> one_dict['name'] 'jym #修改 >>> one_dict['name'] = &

Python开发【第三篇】:Python基本数据类型

运算符 1.算数运算: 2.比较运算: 3.赋值运算: 4.逻辑运算: 5.成员运算: 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值范围为-2**63-2**63-1,即-9223372036854775808-9223372036854775807 class int(object): """ int(x=0) -&

Python 基础【第三篇】输入和输出

这里我们创建一个python(pytest)脚本用于学习测试(以后都为这个文件,不多做解释喽),这个文件必须要有执行权限的哈 1.创建pytest并赋予执行权限 [[email protected]_server py]# touch pytest [[email protected]_server py]# chmod +x pytest 2. 基本输出“print” [[email protected]_server py]# vim pytest #指定python可执行程序路径 #!/u