在操作数据文件时,如果是字符串数据类型的话,可以使用文本读写方式进行操作,但是数据类型不仅仅只有字符串类型,还有list,dict,tuple,set等。那如果我们遇到这些数据类型,还用文本读写方式读写的话,list,dict等都先需变成字符串,再进行读写,原本的数据类型都保存不下来,所以说该如何解决这个问题呢?这时我们需要序列化与反序列化处理。
序列化:是将对象转化为字节序列的过程
反序列化: 是将字节序列转化为对象的过程
python有两个模块处理序列化操作 pickle模块与json模块
这两个模块都提供了dump,dumps ,load ,loads 方法来进行序列化与反序列化操作
其中dump与load方法配套使用,dumps与loads方法配套使用
dump方法是将python中的对象保存在文件中
pickle.dump(obj, file, [,protocol])
注意:
1、obj是要分装的对象
2、file表示obj要写入的对象,file对象须要有一个write()接口,在pickle中必须以wb(二进制)形式打开
3、参数protocol是序列化模式,默认是0(ASCII协议,表示以文本的形式进行序列化),protocol的值还可以是1和2(1和2表示以二进制的形式进行序列化。其中,1是老式的二进制协议;2是新二进制协议)
load方法是将文件中的数据解析成python中的对象
load(file)
注意:其中file对象实现了read()或readline()接口
在pickle模块中必须以rb(二进制)形式打开
import pickle
list_data=[{'name': '1', 'sex': '男', 'phone': '1'},
{'name': '2', 'sex': '女', 'phone': '2'}]
print("写入文件之前数据类型",type(list_data))
#向文件中写入数据
with open("D:/File/a.txt","wb") as f:
pickle.dump(list_data,f)
#从文件中读取数据
with open("D:/File/a.txt","rb") as f:
b=pickle.load(f)
print("从文件中取出数据的类型",type(b),b)
写入文件之前数据类型
从文件中取出数据的类型 [{'name': '1', 'sex': '男', 'phone': '1'}, {'name': '2', 'sex': '女', 'phone': '2'}]
在json模块中以文本形式读取
import json
list_data=[{'name': '1', 'sex': '男', 'phone': '1'},
{'name': '2', 'sex': '女', 'phone': '2'}]
print("写入文件之前数据类型",type(list_data))
#向文件中写入数据
with open("D:/File/a.txt","w") as f:
json.dump(list_data,f)
#从文件中读取数据
with open("D:/File/a.txt","r") as f:
b=json.load(f)
print("从文件中取出数据的类型",type(b),b)
写入文件之前数据类型
从文件中取出数据的类型 [{'name': '1', 'sex': '男', 'phone': '1'}, {'name': '2', 'sex': '女', 'phone': '2'}]
以二进制读取出现了错误:
with open("D:/File/a.txt","wb") as f:
json.dump(list_data,f)
#从文件中读取数据
with open("D:/File/a.txt","rb") as f:
b=json.load(f)
print("从文件中取出数据的类型",type(b),b)
TypeError: a bytes-like object is required, not 'str'
dumps(object) 此方法将对象转为字节序列
import pickle
list_data=[{'name': '1', 'sex': '男', 'phone': '1'},
{'name': '2', 'sex': '女', 'phone': '2'}]
a=pickle.dumps(list_data)
print(type(a),a)
b'\x80\x03]q\x00(}q\x01(X\x04\x00\x00\x00nameq\x02X\x01\x00\x00\x001q\x03X\x03\x00\x00\x00sexq\x04X\x03\x00\x00\x00\xe7\x94\xb7q\x05X\x05\x00\x00\x00phoneq\x06h\x03u}q\x07(h\x02X\x01\x00\x00\x002q\x08h\x04X\x03\x00\x00\x00\xe5\xa5\xb3q\th\x06h\x08ue.'
loads(bytes) 将字节序列转化为对象
import pickle
list_data=[{'name': '1', 'sex': '男', 'phone': '1'},
{'name': '2', 'sex': '女', 'phone': '2'}]
a=pickle.dumps(list_data)
print(type(a),a)
#字节序列转化为python中的对象
b=pickle.loads(a)
print(type(b),b)
b'\x80\x03]q\x00(}q\x01(X\x04\x00\x00\x00nameq\x02X\x01\x00\x00\x001q\x03X\x03\x00\x00\x00sexq\x04X\x03\x00\x00\x00\xe7\x94\xb7q\x05X\x05\x00\x00\x00phoneq\x06h\x03u}q\x07(h\x02X\x01\x00\x00\x002q\x08h\x04X\x03\x00\x00\x00\xe5\xa5\xb3q\th\x06h\x08ue.'
[{'name': '1', 'sex': '男', 'phone': '1'}, {'name': '2', 'sex': '女', 'phone': '2'}]
在json模块中dumps与loads方法与之相似,不过转化的是字符串序列和python对象
import json
list_data=[{'name': '1', 'sex': '男', 'phone': '1'},
{'name': '2', 'sex': '女', 'phone': '2'}]
a=json.dumps(list_data)
print(type(a),a)
#字节序列转化为python中的对象
b=json.loads(a)
print(type(b),b)
[{"name": "1", "sex": "\u7537", "phone": "1"}, {"name": "2", "sex": "\u5973", "phone": "2"}]
[{'name': '1', 'sex': '男', 'phone': '1'}, {'name': '2', 'sex': '女', 'phone': '2'}]