序列化与反序列化(python)

1、为什么要使用序列化与反序列化?

在操作数据文件时,如果是字符串数据类型的话,可以使用文本读写方式进行操作,但是数据类型不仅仅只有字符串类型,还有list,dict,tuple,set等。那如果我们遇到这些数据类型,还用文本读写方式读写的话,list,dict等都先需变成字符串,再进行读写,原本的数据类型都保存不下来,所以说该如何解决这个问题呢?这时我们需要序列化与反序列化处理。

2、什么是序列化与反序列化?

序列化:是将对象转化为字节序列的过程

反序列化:  是将字节序列转化为对象的过程

3、如何使用序列化与反序列化操作?

python有两个模块处理序列化操作 pickle模块与json模块

这两个模块都提供了dump,dumps ,load ,loads 方法来进行序列化与反序列化操作

其中dump与load方法配套使用,dumps与loads方法配套使用

4、dump方法与load方法(以pickle模块为例)

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'

5、dumps方法与loads方法(以pickle模块为例)

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'}]

你可能感兴趣的:(python,python)