Python之数据序列化(json、pickle、shelve)详解
什么是序列化
什么是序列化,把程序中的对象或者变量,从内存中转换为可存储或可传输的过程称为序列化。在Python中,这个过程称为pickling,在其他语言中也被称为serialization,marshalling,flattening等。程序中的对象(或者变量)在序列化之后,就可以直接存放到存储设备上,或者直接发送到网络上进行传输。
序列化的逆向过程,即为反序列化(unpickling),就是把序列化的对象(或者变量)重新读到内存中~
Python中序列化的模块
| 模块名称 | 描述 | 提供的api |
|---|---|---|
| json | 用于实现Python数据类型与通用(json)字符串之间的转换 | dumps()、dump()、loads()、load() |
| pickle | 用于实现Python数据类型与Python特定二进制格式之间的转换 | dumps()、dump()、loads()、load() |
| shelve | 专门用于将Python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象,操作十分便捷 | open() |
json模块
大部分编程语言都会提供处理json数据的接口,Python2.6开始加入了json模块,且把它作为一个内置模块提供,无需下载即可使用。
json支持的数据格式有限,有intstrlistdict以及特殊的tuple(会将tuple转为list)
Json模块提供了四个功能:dumps、dump、loads、load
dumps和loads主要是在内存内操作,如下:
importjson 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是从文件内操作,如下:
importjson
list=['a','b','c']
withopen('test','w',encoding='utf-8')asf:
json.dump(list,f)
withopen('test','r',encoding='utf-8')asf2:
json.load(f2)
json模块中的字符编码问题
在Python3中,代码中的字符串都是使用unicode格式存放的,序列化之后也是以unicode格式存放,所以序列化和反序列化过程都不存在问题。
Python2中,代码中的字符串是str类型,str类型和unicode类型的关系如下所示:
unicode----->encode-------->str(例如为utf-8编码)
utf-8(例如为utf-8编码)-------->decode---------->unicode
所以在Python2中,序列化过程和反序列化过程都有涉及到转码过程(encode和decode),序列化过程会先将对象中的字符串使用utf-8进行解码(decode),转换为unicode类型后,再存放到文件或者字符串中,反序列化过程会将json字符串使用utf-8编码(encode),然后存放到内存中的变量~
pickle模块
用法与json类似,不过pickle不能跨语言,优点是它支持python所有的数据类型
需要注意的是,pickle是以bytes类型来进行序列化的
importpickle 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模式打开,如下:
importpickle
list=['a','b','c']
withopen('test','wb')asf:
pickle.dump(list,f)
withopen('test','rb')asf2:
pickle.load(f2)
shelve模块
shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些。shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似。
importshelve
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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。