1.什么是序列化&反序列化?

序列化:将字典、列表、类的实例对象等内容转换成一个字符串的过程。

反序列化:将一个字符串转换成字典、列表、类的实例对象等内容的过程

PS:Python中常见的数据结构可以统称为容器。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。

场景一:我们在python中将一个功能给另外一段程序使用,怎么给?

方法一:功能存到文件,然后另一个python程序再从文件里读出来。

场景二:现在反过来怎么把读出来的文件字符串转换成字典?

方法二:eval()函数:将字符串str当成有效的表达式求值并返回计算结果,但存在风险,将str转换成python中的数据结构,推荐使用反序列化。

序列化就是从dic变成str(dic)的过程,反序列化就是从str(dic)变成dic的过程。

2.为什们要使用序列化?

  序列化的目的:

    1.以某种存储形式使自定义对象持久化(比如从内存存到硬盘)

    2.将对象从一个地方传递到另一个地方

    3.使程序更具维护性

序列化的2个模块:

  json:用于字符串(str)和python数据类型间(比如字典、列表)进行转换

  pickle:用于python特有的类型和python的数据类型间转换

3.json

Json是一种轻量级的数据交换格式,基于ECMAScript的一个子集。Python3中可以使用json模块来对json数据进行编解码.

python本质:字符串,字符串中的值用双引号,包含了2个函数:

  python对象->json:json.dumps(python对象)

  json->python对象:json.loads(json字符串)

json.dumps():对数据进行编码,就是将mysql里的数据字符串或二进制的形式存储到硬盘。

dumps:输出到终端的操作方法,也就是把一个类型变量转换成str
dump:文件操作的方法,具体的操作json.dump(dict,open('test','w'))

json.loads():对数据进行解码,将抽象的数据内容(python对象)转换成字符串。

json.load和json.loads是反序列化输出的一个结果,dump和dumps是序列化输出终端或文件中去.

python对象(基本的数据类型):int、float、str、list、tuple、dict

需求:序列化,将字典info转换成字符串,存到test1.txt文件中。

ex1:用dumps()函数序列化,通过f.write()写入同级目录test1.txt文件。

import json
info={
'name':'wendy',
'age':22
}
f=open("test1.txt",'w')
#json.dumps(info)把一个字典info转换成字符串,从内存存到硬盘的过程叫序列化
#序列化dumps函数不可以序列化,只能处理简单的跨平台数据交互
f.write(json.dumps(info))
f.close()

ex2:用dump()函数序列化,直接json.dump()写入test1.txt文件。

import json
info={
'name':'wendy',
'age':22
}
f=open("test1.txt",'w')
#等于f.write(json.dumps(info))
json.dump(info,f)
f.close()

需求:用loads()函数反序列化,将字符串转换成python对象

#方式一:将字符串转换成python对象
import json
json_str1="""{"name": "wendy", "age": 22}"""
json_str3 = """12"""
name1=json.loads(json_str1) #将字符串转换成字典
name2=json.loads(json_str3) #将数字转换成数字
print(type(name1),type(name2)) #打印类型
print(name1,name2)
#显示结果如下:
<class 'dict'> <class 'int'>
{'name': 'wendy', 'age': 22} 12 #方式二:从同级目录test1.txt中取值,将字符串转换成python对象
#test1.txt中的值:{"name": "wendy", "age": 22}
import json
f=open("test1.txt",'r')
data =json.loads(f.read())#等于json.load(f)
print(data["name"])
#显示结果如下:
wendy

4.pickle

pickle的load、loads和dump、dumps的使用操作,先来说下,pickle和json的差异:

 4.1 pickle和json都可以实现序列化和反序列化的操作

 4.2 在写入文件的时候,pickle是以加密的方式写入的,在打开文件的时候用'rb'模式,用‘wb’模式写入(二进制的形式)

 4.3 pickle可以对类创建的对象进行反序列化输入到文件中

pickle模块的4个功能:dump(序列化,存)、dumps、loads(反序列化,读)、load

import pickle
class ABC:
a=10
def __init__(self,m,n):
self.m=m
self.n=n abc=ABC(1,2)
res=pickle.dumps(abc) #pickle可序列化任意类型,比如:序列化类实例
back_res=pickle.loads(res)
print(res)
print(back_res)
print(back_res.a)
#结果显示
b'\x80\x03c__main__\nABC\nq\x00)\x81q\x01}q\x02(X\x01\x00\x00\x00mq\x03K\x01X\x01\x00\x00\x00nq\x04K\x02ub.'
<__main__.ABC object at 0x000001D7A0B31048>
10

python序列化与反序列化(json、pickle)-(五)的更多相关文章

  1. day5-python中的序列化与反序列化-json&pickle

    一.概述 玩过稍微大型一点的游戏的朋友都知道,很多游戏的存档功能使得我们可以方便地迅速进入上一次退出的状态(包括装备.等级.经验值等在内的一切运行时数据),那么在程序开发中也存在这样的需求:比较简单的 ...

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

    Python序列化与反序列化-json与pickle 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.json的序列化方式与反序列化方式 1>.json序列化 #!/usr ...

  3. Python开发之序列化与反序列化:pickle、json模块使用详解

    1 引言 在日常开发中,所有的对象都是存储在内存当中,尤其是像python这样的坚持一切接对象的高级程序设计语言,一旦关机,在写在内存中的数据都将不复存在.另一方面,存储在内存够中的对象由于编程语言. ...

  4. python类库32[序列化和反序列化之pickle]

      一 pickle pickle模块用来实现python对象的序列化和反序列化.通常地pickle将python对象序列化为二进制流或文件.   python对象与文件之间的序列化和反序列化: pi ...

  5. python模块概况,json/pickle,time/datetime,logging

    参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html http://www.cnblogs.com/alex3714/articles/51 ...

  6. Python序列化和反序列化

    Python序列化和反序列化 通过将对象序列化可以将其存储在变量或者文件中,可以保存当时对象的状态,实现其生命周期的延长.并且需要时可以再次将这个对象读取出来.Python中有几个常用模块可实现这一功 ...

  7. Python 序列化与反序列化

    序列化是为了将内存中的字典.列表.集合以及各种对象,保存到一个文件中(字节流).而反序列化是将字节流转化回原始的对象的一个过程. json库 序列化:json.dumps() 反序列化:json.lo ...

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

    当今的程序界Json大行其道.因为Json对象具有简短高效等优势,广受广大C#码农喜爱.这里发一个序列化及反序列化Json对象通用类库,希望对大家有用. public class JsonHelper ...

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

    Jackson序列化和反序列化Json数据 Web技术发展的今天,Json和XML已经成为了web数据的事实标准,然而这种格式化的数据手工解析又非常麻烦,软件工程界永远不缺少工具,每当有需求的时候就会 ...

  10. (推荐JsonConvert )序列化和反序列化Json

    在Json文本和.Net对象之间转换最快的方法是试用JsonSerializer. JsonSerializer通过将.Net对象属性名称映射到Json属性名称,并为其复制值,将.Net对象转换为其J ...

随机推荐

  1. 03 . Vue基础之计算属性,组件基础定义和使用

    vue组件 fetch请求组件 fetch XMLHttpRequest是一个设计粗糙的API, 配置和调用方式非常混乱,而且基于事件的异步模型写起来不友好,兼容性不好. <!DOCTYPE h ...

  2. Mycat分库分表(一)

    随着业务变得越来越复杂,用户越来越多,集中式的架构性能会出现巨大的问题,比如系统会越来越慢,而且时不时会宕机,所以必须要解决高性能和可用性的问题.这个时候数据库的优化就显得尤为重要,在说优化方案前,先 ...

  3. JS变量、作用域和内存问题

    一.基本类型和引用类型 1. 基本类型值指的是简单的数据段,引用类型值指那些可能由多个值组成的对象. 2. 基本类型值按值访问,引用类型值按引用访问: 按值访问对于基本类型而言,不同变量指向的地址空间 ...

  4. 调整PG分多次调整和一次到位的迁移差别分析

    前言 这个问题来源于我们研发的一个问题,在进行pg调整的时候,是一次调整到位好,还是分多次调整比较好,分多次调整的时候会不会出现某个pg反复挪动的问题,造成整体迁移量大于一次调整的 最近自己的项目上也 ...

  5. FreeMark导出word文件

    1.编辑好word 2.将word模板另存为xml格式, 把需要动态生成的文字用${xxx}代替 eg: 张强 替换为:${name} 注意:图片是很长的一个base64的字符,同样替换就好 比如替换 ...

  6. Python _PyQt5对话框

    Python 调用PyQt5 制作对话框,退出时候有二次确认(注:默认是直接退出) 1 # -*- ytf-8 -*- 2 """ 3 用PyQt建一个对话框,退出时提示 ...

  7. 协程gevent模块和猴子补丁

    # pip 装模块 greenlet和gevent # 协程 # 与进程.线程一样也是实现并发的手段 # 创建一个线程.关闭一个线程都需要创建寄存器.栈等.需要消耗时间 # 协程本质上是一个线程 # ...

  8. 阿里面试官:小伙子,给我说一下Spring 和 Spring Boot 的区别吧

    前言 对于 Spring和 SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot的我当时也是一头雾水,随着经验的积累.我慢慢理解了这两个框架到底有什么区别,相信对 ...

  9. Appium上下文和H5测试(一)

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.混合应用-H5 1.混合应用是什么? 2.怎么样分辨一个 App 页面究竟是原生的还是 We ...

  10. mathtype样式系统使用技巧-通过样式定义来更改方程中的字体

    本教程中,我们主要介绍MathType Desktop的样式系统.演示如何通过更改样式定义来更改方程中的字体.通过样式可以快速轻松地实现我们所需的公式格式,并统一所有公式的样式. 我们以如下公式来作为 ...