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实现从网络下载文件并获得文件大小及类型的方法
Apr 28 Python
Python Web框架Tornado运行和部署
Oct 19 Python
Python基础知识_浅谈用户交互
May 31 Python
简单易懂的python环境安装教程
Jul 13 Python
python交互式图形编程实例(三)
Nov 17 Python
Sanic框架路由用法实例分析
Jul 16 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
Dec 12 Python
python元组和字典的内建函数实例详解
Oct 22 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
解决Python在导入文件时的FileNotFoundError问题
Apr 10 Python
python urllib库的使用详解
Apr 13 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 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
工厂模式在Zend Framework中应用介绍
2012/07/10 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
PHP进程同步代码实例
2015/02/12 PHP
php中判断数组相等的方法以及数组运算符介绍
2015/03/30 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
动态控制Table的js代码
2007/03/07 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
详解maxlength属性在textarea里奇怪的表现
2015/12/27 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
详解Nodejs之npm&package.json
2017/06/15 NodeJs
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
详解VUE2.X过滤器的使用方法
2018/01/11 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
2019/12/20 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
Linux中Python 环境软件包安装步骤
2016/03/31 Python
Python如何通过subprocess调用adb命令详解
2017/08/27 Python
python 常见的反爬虫策略
2020/09/27 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
真正了解CSS3背景下的@font face规则
2017/05/04 HTML / CSS
c语言常见笔试题总结
2016/09/05 面试题
质量工程师岗位职责
2013/11/16 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
劳动仲裁代理词范文
2015/05/25 职场文书
教师节表彰会主持词
2015/07/06 职场文书