Python序列化——pickle模块

来源:互联网 发布:怎么做数据透视表 编辑:程序博客网 时间:2024/05/22 02:01

序列化——pickle模块

在程序运行的过程中,所有的变量都是在内存中,变量可以随时修改,但若修改的变量没有存储到磁盘上,一旦程序结束,变量所占用的内存就被操作系统全部回收;因此,下次重新运行程序时,修改的变量又会被还原成初始化状态。

所谓的序列化,就是把变量从内存中变成可存储或传输的过程;序列化之后,序列化后的内容会被写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化。在Python中我们称它们为:pickling和unpickling。

#===========================================================#新建一个.txt文件,存储位置:E:/orig_data/test.txtimport picklefile = open("E:/orig_data/test.txt",'wb')data = dict(name = 'Mickle', age = 25, score = 90)pickle.dump(data, file)file.close()#============================================================

运行上述代码,然后打开得到的test.txt文件,结果是这样的:

见鬼了,咱明明保存的是一个dict文本,怎么变成变成一堆乱码,想知道为什么?这些其实都是Python保存的对象内部信息,只是当写入test文件后的内容咱看不懂而已,我们可以通过反序列化,来查看写入的内容:

#===========================================================#新建一个.txt文件,存储位置:E:/orig_data/test.txtimport picklefile = open("E:/orig_data/test.txt",'rb')data = pickle.load(file)file.close()print(data)#============================================================
结果为:


变量的内容又回来了!但需要注意的是:此时的变量和原来的变量是完全不相干的对象,只是内容相同而已。

Pickle 的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于 Python,并且可能不同版本的 Python 彼此都不兼容。那么问题来了,如果我们要在不同的编程语言之间传递对象呢?那该怎么办?

标准序列化——JSON模块

不同的编程语言之间传递对象,就必须把对象序列化为标准格式,如 XML,但更好的方法是序列化为 JSON,因为 JSON 表示出来就是一个字符串,不仅读取速度快,符合Web标准,而且能被所有语言读取,也可方便地存储到磁盘或者通过网络传输。

#===========================================================#新建一个.txt文件,存储位置:E:/orig_data/test.txtimport jsonfile = open("E:/orig_data/test.txt",'w')data = dict(name = 'Mickle', age = 25, score = 90)json.dumps(data, file)file.close()#============================================================
利用JSON序列化,只需将程序中的pickle换成json。

需要注意:dumps()方法返回就是一个str,因此在file中读写模式不能写成‘wb',只能改为’w'。

查看test文件的保存的结果:

保存的结果一目了然,当然我们也可像pickle一样通过JSON反序列化为Python对象,利用load()或loads()方法。

由于 JSON 标准规定 JSON 编码是 UTF-8,所以我们总是能正确地在Python 的 str 与 JSON 的字符串之间转换。

原创粉丝点击