将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML、JSON或特定格式的字节串)的过程称为序列化;反之,则称为反序列化。
大部分编程语言都会提供处理json数据的接口,Python 2.6开始加入了json模块,且把它作为一个内置模块提供,无需下载即可使用。
Python的JSON模块 序列化与反序列化的过程分别叫做:encoding 和 decoding。
encoding: 把Python对象转换成JSON字符串
decoding: 把JSON字符串转换成python对象
import json
d = {'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
j = json.dumps(d)
j
'{"name": "tom", "age": 20, "interest": ["music", "movie"]}'
d1 = json.loads(j)
d1
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
1)sort_keys参数: 表示序列化时是否对dict的key进行排序(dict默认是无序的)
j1 = json.dumps(d, sort_keys=True)
j1
'{"age": 20, "interest": ["music", "movie"], "name": "tom"}'
2)indent参数: 表示缩进的意思,它可以使得数据存储的格式变得更加优雅、可读性更强;如果indent是一个非负整数或字符串,则JSON array元素和object成员将会被以相应的缩进级别进行打印输出;如果indent是0或负数或空字符串,则将只会插入换行,不会有缩进。
j2 = json.dumps(d, sort_keys=True, indent=4)
j2
'{\n "age": 20,\n "interest": [\n "music",\n "movie"\n ],\n "name": "tom"\n}'
# 序列化到文件中
with open('test.json', 'w') as fp:
json.dump(d, fp, indent=4)
# 反序列化文件中的内容
with open('test.json', 'r') as fp:
d3 = json.load(fp)
d3
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
pickle模块实现了用于对Python对象结构进行 序列化 和 反序列化 的二进制协议,与json模块不同的是pickle模块序列化和反序列化的过程分别叫做 pickling 和 unpickling:
pickling: 是将Python对象转换为字节流的过程;
unpickling: 是将字节流二进制文件或字节对象转换回Python对象的过程;
pickle模块与json模块对比:
1.JSON是一种文本序列化格式(它输出的是unicode文件,大多数时候会被编码为utf-8),而pickle是一个二进制序列化格式;
2.JOSN是我们可以读懂的数据格式,而pickle是二进制格式,我们无法读懂;
3.JSON是与特定的编程语言或系统无关的,且它在Python生态系统之外被广泛使用,而pickle使用的数据格式是特定于Python的;
4.默认情况下,JSON只能表示Python内建数据类型,对于自定义数据类型需要一些额外的工作来完成;pickle可以直接表示大量的Python数据类型,包括自定数据类型(其中,许多是通过巧妙地使用Python内省功能自动实现的;复杂的情况可以通过实现specific object API来解决)
import pickle
# pickle序列化
d = {'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
p = pickle.dumps(d)
p
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00tomq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x08\x00\x00\x00interestq\x04]q\x05(X\x05\x00\x00\x00musicq\x06X\x05\x00\x00\x00movieq\x07eu.'
# pickle反序列化
d4 = pickle.loads(p)
d4
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
# 持久化到文件
with open('pickle.txt', 'wb') as f:
pickle.dump(d, f)
# 从文件中读取数据
with open('pickle.txt', 'rb') as f:
d5 = pickle.load(f)
d5
{'name': 'tom', 'age': 20, 'interest': ['music', 'movie']}
首先来自定义一个数据类型:
class Student(object):
def __init__(self, name, age, sno):
self.name = name
self.age = age
self.sno = sno
def __repr__(self):
return 'Student [name: %s, age: %d, sno: %d]' % (self.name, self.age, self.sno)
pickle模块可以直接对自定数据类型进行序列化/反序列化操作,无需编写额外的处理函数或类。
stu = Student('Tom', 19, 1)
stu
Student [name: Tom, age: 19, sno: 1]
# 持久化到文件
with open('stu_pickle.txt', 'wb') as f:
pickle.dump(stu, f)
# 从文件中读取数据
with open('stu_pickle.txt', 'rb') as f:
stu_pickle = pickle.load(f)
stu_pickle
Student [name: Tom, age: 19, sno: 1]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2019-04-07 06SVM线性不可分时scikit-learn实现