序列化和反序列化
一、概念
通过文件操作,可将字符串写入到一个本地文件,但是无法将一个对象,如:字典,列表,元组直接写入到一个文件里,这是就需要将这个对象进行序列化,然后写入文件。设计一套协议,按照某种规则,把内存中的数据转换为字节序列,保存到文件,这就是序列化,反之,从文件的字节序列恢复到内存中,就是反序列化。
序列化: 将对象转换为字节序列。
反序列化:将字节序列转换为对象。
可序列化的数据类型
可序列化:number、str、list、tuple、dict [字典是最常用的序列化数据类型]。
不可序列化:class 、def (函数与实例化对象)、set 是无法进行序列化的。
二、JSON模块
在Python中,JSON模块可以用来实现序列化和反序列化,JSON本质为字符串。JSON提供了dump和dumps方法,将一个对象序列化。把对象转换为字符串,方法本身不具备将数据写入到文件的功能。
python | json |
字典dict | object |
列表list、元组tuple | 数组array |
int、float | number |
True | true |
False | false |
None | null |
Python的序列化
dumps()
import json names = ['Jack', 'Dennis', 'Lucy', 'Mike', 'Tony'] # dumps 传入一个对象,转换为一个JSON字符串 result = json.dumps(names) print(result) print(type(result)) # <class ‘str’> with open('json.txt', 'w') as f: f.write(result)
dump()
import json names = ['Jack', 'Dennis', 'Lucy', 'Mike', 'Tony'] fp =open('json2.txt', 'w') json.dump(names, fp) fp.close() # 或者-------------------------------- with open('json3.txt', 'w') as f: json.dump(names, f)
Python反序列化
loads( )
with open('json.txt', 'r') as f: content = f.read() print(content) print(type(content)) 结果: ["Jack", "Dennis", "Lucy", "Mike", "Tony"] <class 'str'>
import json with open('json.txt', 'r') as f: content = f.read() result = json.loads(content) print(type(result)) 结果:<class 'list'>
使用loads( )方法后将字符串转变为列表对象了
load()
import json with open('json.txt') as f: result = json.load(f) print(result) print(type(result)) 结果: ['Jack', 'Dennis', 'Lucy', 'Mike', 'Tony'] <class 'list'>
举个栗子
import json person = {"name": "maomao", "age": 24, "is_married": True} print("序列化前的数据:", person) json1 = json.dumps(person) # 序列化操作 print("序列化后的数据:", repr(json1)) # repr是一个展示对象的函数 person2 = json.loads(json1) # 反序列化操作 print("反序列化后的数据:", person2) 执行结果: 序列化之前的数据: {'name': 'maomao', 'age': 24, 'is_married': True} 序列化之后的数据: '{"name": "maomao", "age": 24, "is_married": true}' 反序列化之后的数据: {'name': 'maomao', 'age': 24, 'is_married': True}