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

Evan
Evan
发布时间:2026-10-15| 5人浏览过
原创

本文详解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数据序列化的详细实现已介绍完毕,更多相关技术内容可参考本站过往文章或继续浏览后续章节,感谢支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。