本篇主要介绍json、pickle和shelve模块,其中包括该三种模块的用法和其用途。
一、json模块
在之前我们学习eval内置函数时,提到eval可以将一个字符串转换为一个python对象,然而不幸的是,eval只能处理简单的普通的类型,但遇到特殊类型的时候,eval就不好使了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值。例如:
x="['null',True,False,1]"
print(eval(x),type(eval(x)))
#若使用json模块则需有个序列化和反序列化的过程,如下:
import json
y=["null",True,False,1]
#序列化
st1=json.dumps(y)
print(st1,type(st1))
#反序列化
lis1=json.loads(st1)
print(lis1,type(lis1))
那么什么是序列化呢?
我们把对象(或者变量)从内存中变为可存储或者可传输的过程称为序列化。在python中为pickling,在其他语言中也被称之为serialization,marshalling,flattening等等。
即序列化之后既可以将内存中的程序内容写入硬盘或者通过网络传输到其他机器上去。
而反序列化的过程则相反:将硬盘中的内容变为可以在内存中运行的程序的过程称为反序列化。
接下来我们看一下实现序列化和反序列化的几种方法:dump、dumps、load、loads等
dumps 和 loads
#通过序列化和反序列化将内容存储到文件
import json
info={"name":"little-five","age":22,"hobby":"dance"}
#dumps --> 序列化
info_str=json.dumps(info)
with open("information.txt","w") as f1:
f1.write(info_str)
with open("information.txt","r") as f2:
# print(f2.read(),type(f2.read()))
#loads --> 反序列化
info_dict=json.loads(f2.read())
print(info_dict,type(info_dict))
dump 和 load
import json
info={"name":"little-five","age":22,"hobby":"dance"}
f1=open("information.txt","w")
json.dump(info,f1) #== 1、info=json.dumps(info) 2、f.write(info)
f1.close()
f2=open("information.txt","r")
info_dic=json.load(f2) #== info_dic =json.loads(f2.read())
print(info_dic,type(info_dic))
二、pickle模块
pickle和json的用法几乎相同,但是pickle可以处理的数据类型更多,但是仅限于python的使用,而无法应用到其他的语言中去,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。
同时:1、pickle序列化后处理成字节格式,而json序列化后处理成字符串格式。
2、pickle的序列化和反序列化必须同用。而json不必。
import pickle
dic={'name':'amanda','age':23}
dic = pickle.dumps(dic) #处理成字节格式
print(dic,type(dic))
#输出为:b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00amandaq\x02X\x03\x00\x00\x00ageq\x03K\x17u.' <class 'bytes'>
#由于写入的是字节格式,故必须用wb模式写入
with open("pickle_test","wb") as f1:
# f1.write(bytes("hello world",encoding="utf-8"))
f1.write(dic)
#写入的文本是不可读的,即打开pickle_test显示为不可读
f2 =open("pickle_test","rb")
data=pickle.loads(f2.read())
print(data,type(data))
#输出为:{'name': 'amanda', 'age': 23} <class 'dict'>
三、shelve模块
shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型。
import shelve
f=shelve.open(r"shelve_test.txt")
f["stu1"]={"name":"little-five","age":22}
f["stu2"]={"name":"amanda","age":23}
f["school"]={"name":"shehui_university","addr":"China"}
# f.close()
stu1_info=f.get("stu1")
print(stu1_info["age"]) #22
shelve模块在存储时,会创建三个文件,即也是以特殊文件的形式,可以使用字典的存储功能,相当于更加高级的内容管理文件。如下:
总结:这三种模块主要针对序列化和反序列化的操作,用于内存中程序的存储和网络传输。三者均有不同点,各有利弊。