Python数据序列化详解:json、pickle与shelve模块实战
本文深入解析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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









