Python数据序列化详解:json、pickle与shelve模块实战

认真发呆
认真发呆
发布时间:2026-10-13| 3人浏览过
原创

本文深入解析Python中的三种核心数据序列化模块:json、pickle和shelve。详细对比它们的数据支持范围、跨语言兼容性以及文件读写模式差异,重点讲解Python 2与3在编码处理上的不同,并提供dumps/loads与dump/load的具体代码示例,帮助开发者根据场景选择最合适的持久化方案。

序列化的基本概念

什么是序列化

序列化是指将程序中的对象或变量从内存状态转换为可存储或可传输格式的过程。在Python中,这一过程通常被称为pickling,而在其他编程语言中,它可能被称为serialization、marshalling或flattening。经过序列化处理后,对象可以直接保存到存储设备中,或通过网络进行传输。

序列化的逆过程称为反序列化(unpickling),即把之前序列化的对象或变量从存储介质重新读取并恢复到内存中。

Python序列化模块概览

Python中序列化的模块

模块名称 描述 提供的api
json 用于实现Python数据类型与通用(json)字符串之间的转换 dumps()、dump()、loads()、load()
pickle 用于实现Python数据类型与Python特定二进制格式之间的转换 dumps()、dump()、loads()、load()
shelve 专门用于将Python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象,操作十分便捷 open()

json模块详解

json模块

大多数编程语言都提供了处理JSON数据的接口。Python从2.6版本开始内置了json模块,用户无需额外下载即可直接使用。

json模块支持的数据格式相对有限,主要包括int、str、list、dict以及特殊的tuple类型(注意:tuple在序列化时会被转换为list)。

json模块提供了四个核心功能:dumps、dump、loads和load。

dumps和loads主要用于内存中的数据操作,示例如下:


import json 
 list = ['a','b','c'] 
 list_str = json.dumps(list)
 print(list_str)   #["a", "b", "c"] 
 list2 = json.loads(list_str)
 print(list2)    #['a', 'b', 'c']

而dump和load则用于文件级别的操作,示例如下:


import json
 list = ['a','b','c']
 with open('test','w',encoding='utf-8') as f:
   json.dump(list,f) 
 with open('test','r',encoding='utf-8') as f2:
   json.load(f2)

json模块中的字符编码问题

在Python 3中,代码内的字符串默认以unicode格式存储,序列化后的结果同样保持unicode格式,因此在序列化和反序列化过程中通常不会遇到编码问题。

在Python 2中,代码中的字符串默认为str类型,str类型与unicode类型的关系如下所示:

unicode -----> encode --------> str(例如为utf-8编码)

utf-8(例如为utf-8编码) --------> decode ----------> unicode

因此,在Python 2中,序列化和反序列化过程都涉及转码操作(encode和decode)。在序列化时,系统会先将对象中的字符串使用utf-8进行解码(decode),转换为unicode类型后再存入文件或字符串;而在反序列化时,json字符串会先使用utf-8编码(encode),然后存入内存变量。

pickle模块详解

pickle模块

pickle的用法与json类似,但它不支持跨语言使用。其显著优点是支持Python中的所有数据类型。

需要注意的是,pickle序列化后的数据以bytes类型存储。


import pickle
 list = ['a','b','c']
 list_str = pickle.dumps(list)
 print(list_str)     #b'\x80\x03]q\x00(X\x01\x00\x00\x00aq\x01X\x01\x00\x00\x00bq\x02X\x01\x00\x00\x00cq\x03e.'
 
 list2 = pickle.loads(list_str)
 print(list2)      #['a', 'b', 'c']

正因为pickle处理的是bytes类型,所以在使用dump和load方法对文件进行写入或反序列化时,必须以wb(写二进制)或rb(读二进制)模式打开文件,示例如下:


import pickle
 list = ['a','b','c']
 with open('test','wb') as f:
   pickle.dump(list,f) 
 with open('test','rb') as f2:
   pickle.load(f2)

shelve模块详解

shelve模块

shelve也是Python提供的序列化工具,相比pickle使用起来更为简便。shelve仅提供一个open方法,通过key来访问数据,其使用方式类似于字典对象。


import shelve
 f = shelve.open('test1')
 f['key'] = {'a':1, 'b':2, 'c':'sss'} #直接对文件句柄操作,就可以存入数据
 f['key2'] = {'d':3, 'e':4, 'f':'ddd'}
 f.close()
 f1 = shelve.open('test1')
 dic1 = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
 dic2 = f1['key2']
 f1.close()
 print(dic1)
 print(dic2)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

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

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 算法库。