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通过scapy获取局域网所有主机mac地址示例
May 04 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 Python
pycharm中连接mysql数据库的步骤详解
May 02 Python
Python实现PS图像抽象画风效果的方法
Jan 23 Python
使用Django和Python创建Json response的方法
Mar 26 Python
python内置数据类型之列表操作
Nov 12 Python
图文详解python安装Scrapy框架步骤
May 20 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
Python3实现飞机大战游戏
Apr 24 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 03 Python
python中random.randint和random.randrange的区别详解
Sep 20 Python
Pyside2中嵌入Matplotlib的绘图的实现
Feb 22 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中使用GD库创建圆形饼图的例子
2014/11/19 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
js 替换功能函数,用正则表达式解决,js的全部替换
2010/12/08 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
vue中的计算属性实例详解
2018/09/19 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
JS实现小星星特效
2019/12/24 Javascript
原生JS实现留言板
2020/03/26 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
Python中用format函数格式化字符串的用法
2015/04/08 Python
Python字符串处理之count()方法的使用
2015/05/18 Python
python回调函数中使用多线程的方法
2017/12/25 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
Python 字典中的所有方法及用法
2020/06/10 Python
win10安装python3.6的常见问题
2020/07/01 Python
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
法国在线药房:DoctiPharma
2020/10/21 全球购物
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
学位证书委托书
2014/09/30 职场文书
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js