Python实现数据的序列化操作详解


Posted in Python onJuly 07, 2022

​在日常开发中,对数据进行序列化和反序列化是常见的数据操作,Python提供了两个模块方便开发者实现数据的序列化操作,即 json 模块和 pickle 模块。这两个模块主要区别如下:

  • json 是一个文本序列化格式,而 pickle 是一个二进制序列化格式;
  • json 是我们可以直观阅读的,而 pickle 不可以;
  • json 是可互操作的,在 Python 系统之外广泛使用,而 pickle 则是 Python 专用的;
  • 默认情况下,json 只能表示 Python 内置类型的子集,不能表示自定义的类;但 pickle 可以表示大量的 Python 数据类型。

Json 模块

Json 是一种轻量级的数据交换格式,由于其具有传输数据量小、数据格式易解析等特点,它被广泛应用于各系统之间的交互操作,作为一种数据格式传递数据。它包含多个常用函数,具体如下:

dumps()函数

dumps()函数可以将 Python 对象编码成 Json 字符串。例如:

#字典转成json字符串 加上ensure_ascii=False以后,可以识别中文, indent=4是间隔4个空格显示   

import json         
d={'小明':{'sex':'男','addr':'上海','age':26},'小红':{ 'sex':'女','addr':'上海', 'age':24},}
print(json.dumps(d,ensure_ascii=False,indent=4)) 

#执行结果:
{
    "小明": {
        "sex": "男",
        "addr": "上海",
        "age": 26
    },
    "小红": {
        "sex": "女",
        "addr": "上海",
        "age": 24
    }
}

dump()函数

dump()函数可以将 Python对象编码成 json 字符串,自动写入到文件中,不需要再单独写文件。例如:

#字典转成json字符串,不需要写文件,自动转成的json字符串写入到‘users.json'的文件中 
import json                                                                         
d={'小明':{'sex':'男','addr':'上海','age':26},'小红':{ 'sex':'女','addr':'上海', 'age':24},}
#打开一个名字为‘users.json'的空文件
fw =open('users.json','w',encoding='utf-8')

json.dump(d,fw,ensure_ascii=False,indent=4)

loads()函数

loads()函数可以将 json 字符串转换成 Python 的数据类型。例如:

#这是users.json文件中的内容
{
    "小明":{
        "sex":"男",
        "addr":"上海",
        "age":26
    },
    "小红":{
        "sex":"女",
        "addr":"上海",
        "age":24
    }
}

#!/usr/bin/python3
#把json串变成python的数据类型   
import json  
#打开‘users.json'的json文件
f =open('users.json','r',encoding='utf-8')
#读文件
res=f.read()
print(json.loads(res))   

#执行结果:
{'小明': {'sex': '男', 'addr': '上海', 'age': 26}, '小红': {'sex': '女', 'addr': '上海', 'age': 24}}

load()函数

load()跟loads()功能相似,load()函数可以将 json 字符串转换成 Python 数据类型,不同的是前者的参数是一个文件对象,不需要再单独读此文件。例如:

#把json串变成python的数据类型:字典,传一个文件对象,不需要再单独读文件 
import json   
#打开文件
f =open('users.json','r',encoding='utf-8') 
print(json.load(f))

#执行结果:
{'小明': {'sex': '男', 'addr': '上海', 'age': 26}, '小红': {'sex': '女', 'addr': '上海', 'age': 24}}

Pickle 模块

Pickle 模块与 Json 模块功能相似,也包含四个函数,即 dump()、dumps()、loads() 和 load(),它们的主要区别如下:

dumps 和 dump 的区别在于前者是将对象序列化,而后者是将对象序列化并保存到文件中。

loads 和 load 的区别在于前者是将序列化的字符串反序列化,而后者是将序列化的字符串从文件读取并反序列化。

dumps()函数

dumps()函数可以将数据通过特殊的形式转换为只有python语言认识的字符串,例如:

import pickle
# dumps功能
import pickle
data = ['A', 'B', 'C','D']  
print(pickle.dumps(data))

b'\x80\x03]q\x00(X\x01\x00\x00\x00Aq\x01X\x01\x00\x00\x00Bq\x02X\x01\x00\x00\x00Cq\x03X\x01\x00\x00\x00Dq\x04e.'

dump()函数

dump()函数可以将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件。例如:

# dump功能
with open('test.txt', 'wb') as f:
    pickle.dump(data, f)
print('写入成功')

写入成功

loads()函数

loads()函数可以将pickle数据转换为python的数据结构。例如:

# loads功能
msg = pickle.loads(datastr)
print(msg)

['A', 'B', 'C', 'D']

load()函数

load()函数可以从数据文件中读取数据,并转换为python的数据结构。例如:

# load功能
with open('test.txt', 'rb') as f:
   data = pickle.load(f)
print(data)

['A', 'B', 'C', 'D']

总结

本节给大家介绍 Python 中 json&pickle 模块的常用操作,对于实现数据的序列化和反序列化提供了支撑。

到此这篇关于Python实现数据的序列化操作详解的文章就介绍到这了,更多相关Python数据序列化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
Sep 28 Python
python如何修改装饰器中参数
Mar 20 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 Python
python3 pathlib库Path类方法总结
Dec 26 Python
python实现猜拳游戏
Mar 04 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
Pytorch转onnx、torchscript方式
May 25 Python
Python小白不正确的使用类变量实例
May 29 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 Python
Pycharm安装python库的方法
Nov 24 Python
Django框架实现在线考试系统的示例代码
Nov 30 Python
python中lower函数实现方法及用法讲解
Dec 23 Python
Python如何利用pandas读取csv数据并绘图
Python可视化神器pyecharts绘制水球图
Jul 07 #Python
python数字图像处理之图像自动阈值分割示例
Python 读取千万级数据自动写入 MySQL 数据库
Jun 28 #Python
python数字图像处理:图像简单滤波
Jun 28 #Python
python实现一个简单的贪吃蛇游戏附代码
python数字图像处理之对比度与亮度调整示例
Jun 28 #Python
You might like
表单复选框向PHP传输数据的代码
2007/11/13 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
Div自动滚动到末尾的代码
2008/10/26 Javascript
循环 vs 递归浅谈
2013/02/28 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
python 开发的三种运行模式详细介绍
2017/01/18 Python
python 获取微信好友列表的方法(微信web)
2019/02/21 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
Under Armour美国官网:美国知名高端功能性运动品牌
2016/09/05 全球购物
广告学专业求职信
2014/06/19 职场文书
网络营销计划
2015/01/17 职场文书
检讨书范文2000字
2015/01/28 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
go语言中fallthrough的用法说明
2021/05/06 Golang
TV动画《间谍过家家》公开PV
2022/03/20 日漫