序列化是指把内存里的数据转变成字符串,以使其能保存到硬盘上或者通过网络输送到远程。

序列化的两个模块:

json:只能把python中的int/str/list/tuple/dict类型的数据,可以在不同的语言之间传递数据。Python和JavaScript数据对应关系:

JavaScript Python
{ } dict
[] list
"String" str
12345.6 int/float
true/false True/False
null None

pickle:支持所有的python数据,但是只能在python中使用,存储数据占空间大。

python 的 json库:常用的方法有json.dumps()、json.loads()、json.dump、json.load()

Json

json.dumps():

  1. import json
  2. dic = {"name": "egon", "password": "abc123"}
  3. print(dic)
  4. print(json.dumps(dic))

输出的结果

  1. {'name': 'egon', 'password': 'abc123'}
  2. {"name": "egon", "password": "abc123"}

对比dict类型数据和json类型数据可以知道在json中字符串符号都是用双引号,而在python中一般字符串是用单引号,在打印输出上有一些区别。dic是dict类型,json.dumps(dic)是str类型。

josn.loads():

  1. import json
  2. dic = {"name": "egon", "password": "abc123"}
  3. json_data = json.dumps(dic)
  4. str_dic1 = '{"name": "egon", "password": "abc123"}'
  5. print(json.loads(json_data))
  6. print(json.loads(str_dic1))

输出的结果

  1. <class 'dict'>
  2. {'name': 'egon', 'password': 'abc123'}
  3. <class 'dict'>
  4. {'name': 'egon', 'password': 'abc123'}

根据输出结果可以看出,json.loads()可以把json.dumps()转换的json数据再还原,也可以把字符串中符合json格式的数据还原成dict类型。

json.dump():

  1. import json
  2. dic = {"name": "egon", "password": "abc123"}
  3. file = open('info.json', 'w')
  4. json.dump(dic, file)

这段代码运行后会生成一个info.json文件,json.dump()就是把数据dic转成json数据,然后存入info.json中。

当然也可以用with语句

  1. import json
  2. dic = {"name": "egon", "password": "abc123"}
  3. with open('info.json', 'w') as file:
  4. json.dump(dic, file)

两种方式保存的文件内容一致:

{"name": "egon", "password": "abc123"}

json.load():

  1. import json
  2. dic = {"name": "egon", "password": "abc123"}
  3. with open('info.json', 'r') as file:
  4. data = json.load(file)
  5. print(type(data))
  6. print(data)

输出的结果

  1. <class 'dict'>
  2. {'name': 'egon', 'password': 'abc123'}

json.load()把文件中json格式的字符串还原成字典

关于json的高级用法

一般json不能直接转换自定义的对象,可以定义一个函数用于将对象转换成字典,来实现将自定义对象转换为json数据

定义一个student类,并创建一个对象s

  1. class student:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. def tostr(self):
  6. print(self.name, self.age)
  7. s = student('bighead', 22)

直接调用json.dumps(s),会报错,因为json.dumps()无法直接转换自定义对象

但是查看json.dumps()函数会发现有很多参数

其中有一个default的参数

定义一个把student对象转换成字典的方法

  1. def student_to_dict(s):
  2. return {'name': s.name, 'age': s.age}

然后调用json.dumps()

  1. data = json.dumps(s, default=student_to_dict)
  2. print(data)

输出的结果

{"name": "bighead", "age": 22}

会发现能使用json序列化自定义对象了

但是还可以用另一种不定义函数的方式序列化自定义对象,因为通常每个自定义对象都有一个.__dict__属性

  1. data = json.dumps(s, default=lambda obj:obj.__dict__)
  2. print(data)

输出的结果

{"name": "bighead", "age": 22}

但是这样只能把自定义对象转为json,还不能把json数据还原为自定义对象

查看json.loads()函数的全部参数会发现有一个参数object_hook

定义一个函数把字典转换成student对象

  1. def dict_to_student(dic):
  2. return student(dic['name'], dic['age'])

然后调用json.loads()

  1. s = json.loads(data, object_hook=dict_to_student)
  2. print(type(s))
  3. s.tostr()

输出的结果

  1. <class '__main__.student'>
  2. bighead 22

原本的json数据被转换成了student对象

相同的,json.dump()也能使用default参数,json.load()也能使用object_hook参数


Pickle

pickle.dumps():

这个函数会把python所有的类型的数据转换成二进制数据,所以在把用pickle转换后的数据存进文件时,要使用'wb'的方式,打开文件

  1. import pickle
  2. dic = {'name': 'egon', 'password': 'abc123'}
  3. data = pickle.dumps(dic)
  4. print(data)

运行的结果

b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00egonq\x02X\x08\x00\x00\x00passwordq\x03X\x06\x00\x00\x00abc123q\x04u.'

可以看到,pickle.dumps()可以把字典类型的数据转换成二进制数据

相同的pickle.dump(),也可以把python的数据转换成二进制数据,但是这个方法可以直接将数据存入指定文件

  1. import pickle
  2. dic = {'name': 'egon', 'password': 'abc123'}
  3. with open('pickle', 'wb')as f:
  4. pickle.dump(dic, f)

pickle.loads():

与pickle.dumps()功能相反,这个函数是把pickle.dumps()序列化后的数据还原

  1. dic1 = pickle.loads(data)
  2. print(dic1)

运行的结果

{'name': 'egon', 'password': 'abc123'}

相同的,pickle.load()方法也能将序列化的数据还原,但是pickle.load()需要打开存储序列化数据的文件

  1. with open('pickle', 'rb')as f:
  2. dic2 = pickle.load(f)
  3. print(dic2)

运行的结果

{'name': 'egon', 'password': 'abc123'}

注意:使用pickle读写文件都要用'b'('rb','wb'),而json都用't'('rt','wt')

转载于:https://www.cnblogs.com/zhangshengxiang/p/9475748.html

python模块之json,pickle相关推荐

  1. python模块:JSON模块

    目录 在日常开发中,对数据进行序列化和反序列化,是常备的操作.而在Python标准库中提供了json模块对JSON数据的处理功能. 什么是json? JSON(JavaScript Object No ...

  2. 初学者python笔记(json模块、pickle模块、xml模块、shelve模块)

    文章目录 json模块 正常数据转化(复杂) json模块的相关操作 pickle模块 shelve模块 xml模块 在Python中,json模块.pickle模块.xml模块.shelve模块这四 ...

  3. python写一个很简单的Atm机系统,使用pickle模块和json模块来保存数据

    我做的是一个很简单的Atm系统,很多都没约束条件 目的: 用面向对象思维来处理 运用文件的读写 文件的读写用pickle模块和json模块来处理 pickle模块: pickle模块处理数据功能很强大 ...

  4. 常用模块(json/pickle/shelve/XML)

    一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将 ...

  5. Python基础 day4 迭代器生成器 装饰器 Json pickle 数据序列化 软件目录结构规范 作业:ATM项目开发...

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 列表生成器 1.列表生成式,迭代器&生成器 列表生成式 孩子, ...

  6. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  7. python csv、json、pickle数据持久化

    1. csv/json/pickle基本概念 csv:CSV(Comma Separated Values)格式是电子表格和数据库最常见的导入和导出格式.用文本文件形式储存的表格数据,可以使用exce ...

  8. python中json模块_Python使用内置json模块解析json格式数据的方法

    本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模 ...

  9. python内置json模块的作用_python详解json模块

    我们在做工作中经常会使用到json模块,今天就简单介绍下json模块 什么是json JSON ,全称为JavaScript Object Notation, 也就是JavaScript 对象标记,它 ...

最新文章

  1. 干货丨谷歌最新机器学习术语表
  2. Effective.Java第23-33条(泛型相关)
  3. HTTP强制设置状态码
  4. java存储过程与sql语句_存储过程与SQL语句怎么选择
  5. C#+Sql数据库备份
  6. Angular 内容投影 content projection 的一个问题的单步调试
  7. 让主页或Blog日访问量增加3000
  8. Android 程式开发:(二十)内容提供者 —— 20.6 自定义ContentProvider的使用
  9. linux内存测试工具memtest,Linux-内存检测利器Memtest86+v1.70
  10. php 9000 端口没起来,PHP无法监听9000端口问题/502错误解决办法
  11. Kraken发言人:公司可能会考虑明年上市,但不适合SPAC模式
  12. 稳扎稳打Silverlight(5) - 2.0控件之ListBox, MediaElement, MultiScaleImage, PasswordBox
  13. 中小企业物流配送管理系统SSM开发MYSQL数据库javaweb项目j2ee实现
  14. 【龙芯1c库】封装硬件SPI接口和使用示例
  15. HTML文本框不能复制粘贴,word文本框无法复制粘贴
  16. Unity2D入门(二) 优化玩家移动手感(一)
  17. Android 如何屏蔽返回键和Home键
  18. 郑州大学计算机考研944,2020年郑州大学944计算机技术专业基础综合考研复习资料...
  19. 图片在线预览html,Viewer.js – 强大的JS/jQuery图片查看器
  20. 互联网晚报 | 05月16日 星期一 | 上海:6月1日至6月中下旬全面恢复正常生产生活;微软IE浏览器将于6月16日正式退役...

热门文章

  1. MySQL5.5加主键锁读问题
  2. android interview 1
  3. silverlight、wpf中 dispatcher和timer区别
  4. Painting A Board --POJ 1691
  5. Windows Server 2003 : 服务器群集
  6. Ansible04-任务控制
  7. 手把手教你搭建智能合约测试环境、开发、编译、部署以及如何通过JS调用合约方法
  8. rspec 测试页面元素_如何使用共享示例使您的RSpec测试干燥
  9. 推荐使用的几款Java常用基础工具库
  10. .net内存回收与Dispose﹐Close﹐Finalize方法