本博客为读书笔记,参考以下网站及书籍。
参考网站:http://www.runoob.com/python3/python3-tutorial.html
参考书目:《Python爬虫开发与项目实战》作者 范传辉
对象的序列化在很多高级编程语言中都有相应的实现,Python也不例外。程序运行时,所有的变量都是在内存中的,例如在程序中声明一个dict对象,里面存储着爬取的页面的链接、页面的标题、页面的摘要等信息:
d = dict (url=' index.html' ,title='首页', content='首页')
在程序运行的过程中爬取的页面的链接会不断变化,比如把url 改成了second.html, 但是程序-结束或意外中断,程序中的内存变量都会被操作系统进行回收。如果没有把修改过的url 存储起来,下次运行程序的时候,url 被初始化为index.html, 又是从首页开始,这是我们不愿意看到的。所以把内存中的变量变成可存储或可传输的过程,就是序列化。
将内存中的变量序列化之后,可以把序列化后的内容写人磁盘,或者通过网络传输到别的机器上,实现程序状态的保存和共享。反过来,把变量内容从序列化的对象重新读取到内存,称为反序列化。
在Python中提供了两个模块: cPickle 和pickle来实现序列化,前者是由C语言编写的,效率比后者高很多,但是两个模块的功能是一样的。一般编写程序的时候,采取的方案是先导入cPickle模块,如果此模块不存在,再导人pickle 模块。示例如下:
try:
import cPickle as pickle
except ImportError:
import pickle
pickle实现序列化主要使用的是dumps方法或dump方法。dumps 方法可以将任意对象序列化成一一个str,然后可以将这个str写人文件进行保存。在Python Shell中示例如下:
import cPickle as pickle
d= dict (url='index.html' ,title='首页',content='首页)
pickle. dumps (d)
如果使用dump方法,可以将序列化后的对象直接写人文件中:
d=dict(url='index.html',title='首页',content='首页')
f = open(r'E:\python\Python学习\666.txt', "wb")
pickle.dump(d,f)
f.close()
pickle实现反序列化使用的是loads 方法或load 方法。把序列化后的文件从磁盘上读取为一个str,然后使用loads 方法将这个str 反序列化为对象,或者直接使用load方法将文件直接反序列化为对象,如下所示:
f = open(r'E:\python\Python学习\666.txt', "rb")
e=pickle.load(f)
f.close()
print(e)
通过反序列化,存储为文件的dict对象,又重新恢复出来,但是这个变量和原变量没有什么关系,只是内容一样。以上就是序列化操作的整个过程。
假如我们想在不同的编程语言之间传递对象,把对象序列化为标准格式是关键,例如XML,但是现在更加流行的是序列化为JSON格式,既可以被所有的编程语言读取解析,也可以方便地存储到磁盘或者通过网络传输。