python序列化与反序列化(json与pickle)

在python中,序列化可以理解为将python中对象的编码格式转换为json(pickle)格式的字符串,而反序列化可以 理解为将json(pickle)格式的字符串转换为python中对象的编码格式

举一个简单的例子,我们在vmvare环境下编写python程序,然后需要临时走开一下,但是我们又不想把这个vmvare关闭,这个时候我们可以选择挂机,这样我们再回来继续操作时候,就可以直接恢复到走之前的状态,那么我们之前编写的代码及vmvare的状态是保存在哪里了呢,实际上是保存在文件当中来了,但是我们知道文件只能对字符串这种类型的数据进行处理,这时候在操作过程中,当我们将数据存入文件当中的时候,我们就需要将python对象的编码格式转换成字符串格式,即序列化,同样的,当我们在恢复python中的编码时候,就需要把字符串的编码格式转换成我们需要的编码格式,即所谓的反序列化。而恰好python中的json和pickle模块可以用来实现这一功能

json

json提供了四个功能:dumps,dump,loads,load(前面两个都是用来实现序列化的,后面两个用来实现反序列化)

首先我们来看一下如果不用json序列化到底能不能实现对文件的操作

我们创建一个文件,向里面存入一个字典看看行不行

结果呢

很明显报错了,告诉我们写进文件的内容一定得是字符串格式的,不是字典。

我们试着用json模块写入吧

结果创建了一个文件,并且相应的内容也写进去了

上面我们用了json的dumps功能实现的序列化,我们再用dump实现一下,代码简化了

结果是一样的

我们再来看看反序列化

如果我们不用反序列化,看看能不能找到字典中的name对应的额元素呢

结果是不可以的

那我们来导入json模块吧

我们再用json的另一个反序列化功能load写一下这段代码

结果是一样的

看起来json的功能很强大但是他只能用来实现对列表,字典,字符串这样简单的数据类型进行处理,对于复杂的比如函数就处理不了了,但是他有他的优点,就是可以实现与java等其他语言的交互,鉴于json的局限性,我们试一试pickle吧,他能实现对一切对象的序列化及反序列化操作,但是他不能实现与其他语言的交互

我们先来看看json遇到复杂对象的情况,为此我们定义了一个niusha函数,将他的内存地址添加到字典中

结果似乎差强人意啊

报错了

我们再用pickle试试

结果怎么变成了这样

注意哈,这里我们用pickle.dumps默认变成了二进制。所以报错了。我们需要改动一下

将文件的写的方式改为“wb”即可

我们再来看看pickle的反序列化

结果怎么出错了呢

这是因为我们在序列化中定义的niusha函数,使用完之后就被释放了,所以我们在反序列化过程中找不到这个函数,这里我们是为了证明pickle可以序列化函数等复杂的对象,在实际中是不应该这样用的,如果是在要这么用,我们只能将序列化中的代码copy过来

这样结果就出来了

注意,这里我们都只是尝试了pickle的dump,与load方法,他的dumps功能与loads功能与json用法是一样的,这里就不再描述了

原文地址:https://www.cnblogs.com/niusha/p/9601083.html

时间: 2024-11-30 15:50:04

python序列化与反序列化(json与pickle)的相关文章

Python序列化与反序列化-json与pickle

Python序列化与反序列化-json与pickle 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.json的序列化方式与反序列化方式 1>.json序列化 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90

python序列化与反序列化——json与pickle

一.定义 序列化是指将对象从内存中取出来写入存储区,如txt文件中,反序列则相反. 二. 应用场景 跨平台数据传输: 保留上一次运行程序时对对象的修改 三. 模块和函数 1. json dumps().dump()(序列化) loads().load() (反序列化) 2. pickle dumps().dump()(序列化) loads().load ()(反序列化) 四.  应用案例 1. pickle 1 import pickle 2 3 info = {"lyrics": &

6.python序列化功能之json&pickle

json模块是个非常重要的模块,可以实现任何语言之间跨平台的数据交换,还可以实现一些比较简单的数据类型的持久化.(这里的持久化就是说,把python内部一些比较简单的数据类型,比如说像字符串,列表,元组,字典之类的数据类型,转换为json字符串的标准格式,保存到硬盘中.) json模块常用函数: json.dumps():将python以字典为主的数据类型,包括(列表,元组,等)转换为json字符串. json.loads():将json字符串转换为python可识别的数据类型. json.du

Jackson序列化和反序列化Json数据完整示例

Jackson序列化和反序列化Json数据 Web技术发展的今天,Json和XML已经成为了web数据的事实标准,然而这种格式化的数据手工解析又非常麻烦,软件工程界永远不缺少工具,每当有需求的时候就会出现各种类库,框架以及工具来解决这些基础的问题,Jackson就是这些工具中的一个,使用这个工具开发者完全可以从手工结束Json数据的重复劳动中解放出来.使用Jackson首先需要下载相应的类库,如下的Maven dependency列出了完整的POM dependency. 1 <dependen

C#序列化及反序列化Json对象通用类JsonHelper

当今的程序界Json大行其道.因为Json对象具有简短高效等优势,广受广大C#码农喜爱.这里发一个序列化及反序列化Json对象通用类库,希望对大家有用. public class JsonHelper { #region 对象类型序列化为json 字符 /// <summary> /// 对象类型序列化为json 字符 /// </summary> /// <typeparam name="T">实体类型</typeparam> ///

Newtonsoft.Json.4.5.0 序列化与反序列化json字符串使用方法总结

在VS里下载安装: Json.NET 5.0.6 http://www.nuget.org/packages/Newtonsoft.Json/5.0.6 反序列化json字符串为List: json字符串如下: 1 {"docs": [{ 2 "uid": 2629577, 3 "nickname": "枕边疯电台", 4 "is_v": "true", 5 "category

python序列化与反序列化(json、pickle)

1.什么是序列化&反序列化? 序列化:将字典.列表.类的实例对象等内容转换成一个字符串的过程. 反序列化:将一个字符串转换成字典.列表.类的实例对象等内容的过程 PS:Python中常见的数据结构可以统称为容器.序列(如列表和元组).映射(如字典)以及集合(set)是三类主要的容器. 场景一:我们在python中将一个功能给另外一段程序使用,怎么给? 方法一:功能存到文件,然后另一个python程序再从文件里读出来. 场景二:现在反过来怎么把读出来的文件字符串转换成字典? 方法二:eval()函

Python—序列化和反序列化模块(json、pickle和shelve)

什么是序列化 我们把对象(或者变量)从内存中变为可存储或者可传输的过程称为序列化.在python中为pickling,在其他语言中也被称之为serialization,marshalling,flattening等等.即序列化之后就可以将内存中的程序内容写入硬盘或者通过网络传输到其他机器上去.反序列化的过程则相反:将硬盘中的内容变为可以在内存中运行的程序的过程称为反序列化. Json模块 # encoding:utf-8 # 通过序列化和反序列化将内容存储到文件 import json json

python课堂整理26 ---json、pickle、shelve模块(序列化处理)

一.序列化 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,python中叫pickling 序列化之后就可以把序列化后的内容写入磁盘或通过网络传输到别的机器上 反序列化:unpickling,也就是loads的过程 二.json模块 功能:处理成字符串 可以让不同语言间进行数据交换 import json dic = {"name": "alex"} data = json.dumps(dic) print(data, type(data)) 经js