大鹏

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

pickle:腌制一缸美味的泡菜

 本章内容如下:

     1、pickling
     2、unpickling
     3、什么是序列化
               4、dumps、loads与dump、load的区别    
     5、作业
     6、扩展阅读

 

 

 

pickle 就是泡菜,腌菜的意思。

pickle模块可以把python的任何对象都转化为二进制的形式存放,这个过程称为pickling, 那么从二进制形式转换回对象的过程称为unpickling.

 

 

 1、pickling

#pickling 腌制过程
import pickle
my_list = [123,3.14,'小甲鱼',['another_list']]   #要转换的对象
pickle_file = open('E:\\my_list.pkl','wb')    #创建一个载体,并以二进制的方式来编写,这里好比生产一个坛子,来装泡菜
#使用dump方法来保存数据
pickle.dump(my_list,pickle_file)              #将对象导入载体容器中,就像腌制泡菜
#和普通文件一样,需要关闭文件才能保存
pickle_file.close()                     #腌制好,盖上盖子

#注意:为了避免日后遗忘,混淆,建议使用.pkl或者。pickle格式保存文件

 

生成文件:

 

 

2、unpickling

import  pickle

#以二进制方式打开文件
pickle_file = open('E:\\my_list.pkl','rb')    #相当于打开坛子
#使用load方法加载数据
my_list = pickle.load(pickle_file)   #从坛子里倒出泡菜
print(my_list)


#[123, 3.14, '小甲鱼', ['another_list']] 

 

 

3、什么是序列化

我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

为什么要序列化?

1:持久保存状态

需知一个软件/程序的执行就在处理一系列状态的变化,在编程语言中,'状态'会以各种各样有结构的数据类型(也可简单的理解为变量)的形式被保存在内存中。

内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。

在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。

具体的来说,你玩使命召唤闯到了第13关,你保存游戏状态,关机走人,下次再玩,还能从上次的位置开始继续闯关。或如,虚拟机状态的挂起等。

2:跨平台数据交互

序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

import pickle
 
dic={'name':'alvin','age':23,'sex':'male'}
 
print(type(dic))#<class 'dict'>
 
j=pickle.dumps(dic)
print(type(j))#<class 'bytes'>
 
 
f=open('序列化对象_pickle','wb')#注意是w是写入str,wb是写入bytes,j是'bytes'
f.write(j)  #-------------------等价于pickle.dump(dic,f)
 
f.close()
#-------------------------反序列化
import pickle
f=open('序列化对象_pickle','rb')
 
data=pickle.loads(f.read())#  等价于data=pickle.load(f)
 
 
print(data['age'])

 

Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。

 

4、dumps、loads与dump、load的区别

1、pickle.dump,pickle.load主要用来对pickle文件的读写,需要先进行文件的打开,操作完成后再保存

2、pickle.dumps,pickle.loads之间用于转换的对象,不需要对文件进行打开和保存就能转换数据

 

#pickle.dumps、pickle.loads 用于程序内,不需要打开文件和保存文件
import pickle
my_list = [123,3.14,'小甲鱼',['another_list']]
pickle_file = pickle.dumps(my_list)
print(pickle_file)

my_list1 = pickle.loads(pickle_file)
print(my_list1)

 

 

 

5、作业

[课后作业] 第031讲:永久存储:腌制一缸美味的泡菜 | 课后测试题

 

 

6、扩展阅读

python笔记-dumps()与loads()的使用

python开发之路的pickle

Alex

 

posted on 2018-12-16 14:02  pf42280  阅读(312)  评论(0)    收藏  举报