目录

Python简单好用又强大的数据持久化工具

一、前言:

  • pickle模块作用是将对象进行序列化然后存储或者反序列化为对象。
  • 为什么要序列化和反序列化呢?
  • 数据序列化就是将对象或者数据结构转化成特定的格式,使其可在网络中传输,或者可存储在内存或者文件中。
  • 反序列化则是相反的操作,将对象从序列化数据中还原出来。而对象序列化后的数据格式可以是二进制,可以是XML,也可以是JSON等任何格式。 是持久化的储存数据,实现了基本的数据序列和反序列化。能将任意一个Python对象转换成一系统字节的这个操作过程叫做串行化对象。
  • 通过pickle模块的序列化操作,可以将对象信息保存到文件中去,是永久存储哦;
  • 通过pickle模块的反序列化操作,可以从文件中创建上一次程序保存的对象。

二、Pickle与CPickle对比

  • Pickle是完全用Python来实现的模块

  • CPickle是用C来实现的,它的速度要比pickle快好多倍,一般建议如果电脑中只要有CPickle的话都应该使用它

  • 使用Python2的小伙伴引入时可采用如下模版代码:

      try:
      	import cPickle as pickle
      except ImportError:
      	import pickle
    
  • 而cPickle在python3中更名为pickle了,所以使用Python3的小伙伴直接倒入pickle即可。

三、pickle使用介绍

  • 基本接口:
  • 1、pickle.dump(obj, file, [,protocol]):将对象obj保存到文件file中去。
  • 参数解析:
  • obje:需要保存的数据对象
  • file:对象保存到的类文件对象。file必须有write()接口, file可以是一个以’w’方式打开的文件或者一个StringIO对象或者其他任何实现write()接口的对象。如果protocol>=1,文件对象需要是二进制模式打开的。
  • protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示;1:老式的二进制协议;2:2.3版本引入的新二进制协议,较以前的更高效。其中协议0和1兼容老版本的python。protocol默认值为0。
  • 2、pickle.load(file):从file中读取一个字符串,并将它重构为原来的python对象。
  • 参数解析:

file:类文件对象,有read()和readline()接口。

四、示例代码

  • 1、我们编写一个saveData1方法,该方法调用 pickle.dump(save, fp)直接传入存储的对象和文件

  • 2、我们再编写一个saveData2方法,结果是一样的,只不过我们先调用吗pickle.dumps(save)获取序列化的数据,然后再调用file的write方法写入数据

  • 3、最后写两个loadData1和loadData2用来读取已序列化的数据

      try:
      	import cPickle as pickle
      except ImportError:
      	import pickle
    
      def saveData1():
      	print('saveData1 be called')
      	save = 'hello world1';
      	with open('data1.pkl', 'wb') as fp:
      		pickle.dump(save, fp)
    
      def saveData2():
      	print('saveData2 be called')
    
      	save = 'hello world2';
      	with open('data2.pkl', 'wb') as fp:
      		data = pickle.dumps(save)
      		fp.write(data)
    
      def loadData1():
      	print('loadData1 be called')
    
      	with open('data1.pkl', 'rb') as fp:
      		return pickle.load(fp)
    
      def loadData2():
      	print('loadData2 be called')
    
      	with open('data2.pkl', 'rb') as fp:
      		return pickle.load(fp)
    
      if __name__=="__main__":
      	saveData1();
      	saveData2()
      	print(loadData1())
      	print(loadData2())
    
  • 运行结果如下

      saveData1 be called
      saveData2 be called
      loadData1 be called
      hello world1
      loadData2 be called
      hello world2
    
  • 如上我们便学习了pickle的简单使用

  • 后面有需要需要序列化存储数据的需求就可以使用pickle了哦,感谢你的观看。