Python实现数据的序列化操作详解
本文详解Python中json与pickle模块的数据序列化操作。对比两者在文本/二进制、可读性及互操作性上的差异,并演示dumps、dump、loads、load四个核心函数的具体用法与代码示例,帮助开发者根据场景选择合适的序列化方案。
在常规软件开发流程中,数据的序列化和反序列化是高频出现的数据处理环节。Python语言内置了两个标准库模块以支持此类操作,分别是json模块和pickle模块。这两者在设计理念和适用场景上存在显著差异,具体表现如下:
- json采用文本格式进行序列化,而pickle则采用二进制格式;
- json生成的序列结果具备人类可读性,可直接查看内容,而pickle生成的二进制数据无法直接阅读;
- json具有跨平台互操作性,被广泛集成于Python以外的各类系统和语言中,而pickle是Python语言特有的序列化协议;
- 默认配置下,json仅支持Python内置数据类型的子集,无法直接处理自定义类实例;相比之下,pickle能够序列化更广泛的Python数据类型。
Json模块
Json(JavaScript Object Notation)是一种轻量级的数据交换格式,凭借传输开销低、结构易于解析等优势,成为跨系统交互中广泛采用的数据传递标准。该模块提供了多个核心函数,具体介绍如下:
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()类似,均用于将Json字符串转换为Python数据类型。主要区别在于load()接收文件对象作为参数,直接读取文件内容,无需手动先读取文件字符串。具体使用示例如下:
#把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数据序列化的详细实现已介绍完毕,更多相关技术内容可参考本站过往文章或继续浏览后续章节,感谢支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









