python模块之json,pickle
序列化是指把内存里的数据转变成字符串,以使其能保存到硬盘上或者通过网络输送到远程。
序列化的两个模块:
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():
- import json
- dic = {"name": "egon", "password": "abc123"}
- print(dic)
- print(json.dumps(dic))
输出的结果
- {'name': 'egon', 'password': 'abc123'}
- {"name": "egon", "password": "abc123"}
对比dict类型数据和json类型数据可以知道在json中字符串符号都是用双引号,而在python中一般字符串是用单引号,在打印输出上有一些区别。dic是dict类型,json.dumps(dic)是str类型。
josn.loads():
- import json
- dic = {"name": "egon", "password": "abc123"}
- json_data = json.dumps(dic)
- str_dic1 = '{"name": "egon", "password": "abc123"}'
- print(json.loads(json_data))
- print(json.loads(str_dic1))
输出的结果
- <class 'dict'>
- {'name': 'egon', 'password': 'abc123'}
- <class 'dict'>
- {'name': 'egon', 'password': 'abc123'}
根据输出结果可以看出,json.loads()可以把json.dumps()转换的json数据再还原,也可以把字符串中符合json格式的数据还原成dict类型。
json.dump():
- import json
- dic = {"name": "egon", "password": "abc123"}
- file = open('info.json', 'w')
- json.dump(dic, file)
这段代码运行后会生成一个info.json文件,json.dump()就是把数据dic转成json数据,然后存入info.json中。
当然也可以用with语句
- import json
- dic = {"name": "egon", "password": "abc123"}
- with open('info.json', 'w') as file:
- json.dump(dic, file)
两种方式保存的文件内容一致:
{"name": "egon", "password": "abc123"}
json.load():
- import json
- dic = {"name": "egon", "password": "abc123"}
- with open('info.json', 'r') as file:
- data = json.load(file)
- print(type(data))
- print(data)
输出的结果
- <class 'dict'>
- {'name': 'egon', 'password': 'abc123'}
json.load()把文件中json格式的字符串还原成字典
关于json的高级用法
一般json不能直接转换自定义的对象,可以定义一个函数用于将对象转换成字典,来实现将自定义对象转换为json数据
定义一个student类,并创建一个对象s
- class student:
- def __init__(self, name, age):
- self.name = name
- self.age = age
- def tostr(self):
- print(self.name, self.age)
- s = student('bighead', 22)
直接调用json.dumps(s),会报错,因为json.dumps()无法直接转换自定义对象
但是查看json.dumps()函数会发现有很多参数
其中有一个default的参数
定义一个把student对象转换成字典的方法
- def student_to_dict(s):
- return {'name': s.name, 'age': s.age}
然后调用json.dumps()
- data = json.dumps(s, default=student_to_dict)
- print(data)
输出的结果
{"name": "bighead", "age": 22}
会发现能使用json序列化自定义对象了
但是还可以用另一种不定义函数的方式序列化自定义对象,因为通常每个自定义对象都有一个.__dict__属性
- data = json.dumps(s, default=lambda obj:obj.__dict__)
- print(data)
输出的结果
{"name": "bighead", "age": 22}
但是这样只能把自定义对象转为json,还不能把json数据还原为自定义对象
查看json.loads()函数的全部参数会发现有一个参数object_hook
定义一个函数把字典转换成student对象
- def dict_to_student(dic):
- return student(dic['name'], dic['age'])
然后调用json.loads()
- s = json.loads(data, object_hook=dict_to_student)
- print(type(s))
- s.tostr()
输出的结果
- <class '__main__.student'>
- bighead 22
原本的json数据被转换成了student对象
相同的,json.dump()也能使用default参数,json.load()也能使用object_hook参数
Pickle
pickle.dumps():
这个函数会把python所有的类型的数据转换成二进制数据,所以在把用pickle转换后的数据存进文件时,要使用'wb'的方式,打开文件
- import pickle
- dic = {'name': 'egon', 'password': 'abc123'}
- data = pickle.dumps(dic)
- 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的数据转换成二进制数据,但是这个方法可以直接将数据存入指定文件
- import pickle
- dic = {'name': 'egon', 'password': 'abc123'}
- with open('pickle', 'wb')as f:
- pickle.dump(dic, f)
pickle.loads():
与pickle.dumps()功能相反,这个函数是把pickle.dumps()序列化后的数据还原
- dic1 = pickle.loads(data)
- print(dic1)
运行的结果
{'name': 'egon', 'password': 'abc123'}
相同的,pickle.load()方法也能将序列化的数据还原,但是pickle.load()需要打开存储序列化数据的文件
- with open('pickle', 'rb')as f:
- dic2 = pickle.load(f)
- 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相关推荐
- python模块:JSON模块
目录 在日常开发中,对数据进行序列化和反序列化,是常备的操作.而在Python标准库中提供了json模块对JSON数据的处理功能. 什么是json? JSON(JavaScript Object No ...
- 初学者python笔记(json模块、pickle模块、xml模块、shelve模块)
文章目录 json模块 正常数据转化(复杂) json模块的相关操作 pickle模块 shelve模块 xml模块 在Python中,json模块.pickle模块.xml模块.shelve模块这四 ...
- python写一个很简单的Atm机系统,使用pickle模块和json模块来保存数据
我做的是一个很简单的Atm系统,很多都没约束条件 目的: 用面向对象思维来处理 运用文件的读写 文件的读写用pickle模块和json模块来处理 pickle模块: pickle模块处理数据功能很强大 ...
- 常用模块(json/pickle/shelve/XML)
一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将 ...
- Python基础 day4 迭代器生成器 装饰器 Json pickle 数据序列化 软件目录结构规范 作业:ATM项目开发...
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 列表生成器 1.列表生成式,迭代器&生成器 列表生成式 孩子, ...
- Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json pickle 数据序列化
一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...
- python csv、json、pickle数据持久化
1. csv/json/pickle基本概念 csv:CSV(Comma Separated Values)格式是电子表格和数据库最常见的导入和导出格式.用文本文件形式储存的表格数据,可以使用exce ...
- python中json模块_Python使用内置json模块解析json格式数据的方法
本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模 ...
- python内置json模块的作用_python详解json模块
我们在做工作中经常会使用到json模块,今天就简单介绍下json模块 什么是json JSON ,全称为JavaScript Object Notation, 也就是JavaScript 对象标记,它 ...
最新文章
- 干货丨谷歌最新机器学习术语表
- Effective.Java第23-33条(泛型相关)
- HTTP强制设置状态码
- java存储过程与sql语句_存储过程与SQL语句怎么选择
- C#+Sql数据库备份
- Angular 内容投影 content projection 的一个问题的单步调试
- 让主页或Blog日访问量增加3000
- Android 程式开发:(二十)内容提供者 —— 20.6 自定义ContentProvider的使用
- linux内存测试工具memtest,Linux-内存检测利器Memtest86+v1.70
- php 9000 端口没起来,PHP无法监听9000端口问题/502错误解决办法
- Kraken发言人:公司可能会考虑明年上市,但不适合SPAC模式
- 稳扎稳打Silverlight(5) - 2.0控件之ListBox, MediaElement, MultiScaleImage, PasswordBox
- 中小企业物流配送管理系统SSM开发MYSQL数据库javaweb项目j2ee实现
- 【龙芯1c库】封装硬件SPI接口和使用示例
- HTML文本框不能复制粘贴,word文本框无法复制粘贴
- Unity2D入门(二)	优化玩家移动手感(一)
- Android 如何屏蔽返回键和Home键
- 郑州大学计算机考研944,2020年郑州大学944计算机技术专业基础综合考研复习资料...
- 图片在线预览html,Viewer.js – 强大的JS/jQuery图片查看器
- 互联网晚报 | 05月16日 星期一 | 上海:6月1日至6月中下旬全面恢复正常生产生活;微软IE浏览器将于6月16日正式退役...