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、扩展阅读

浙公网安备 33010602011771号