1.序列化 我们把内存中的对象保存到流或者文件的过程称之为序列化。在Python中叫pickling,在其他语言中也被称之为serialization。Python提供了pickle模块来实现序列化。
目前,序列化和反序列化最好的数据格式是JSON。比如XML,JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:
| JSON类型 | Python类型 |
|---|---|
| {} | dict |
| [] | list |
| "string" | str |
| 1234.56 | int或float |
| true/false | True/False |
| null | None |
实例:
# -*- coding: utf-8 -*-
# @Time : 2022/4/21 9:26
# @File : serializabledemo.py
# @Software : PyCharm
import pickle
# 序列化到文件
d = dict(name='张三丰', age=60, address='湖北武当山')
f = open('dump.txt', 'wb')
pickle.dump(d, f)
f.close()
# 从文件反序列化
f = open('dump.txt', 'rb')
d = pickle.load(f)
f.close()
print(d)
运行结果:
{'name': '张三丰', 'age': 60, 'address': '湖北武当山'}
2.python对象与json转换
Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。
import json
d = dict(name='张三丰', age=60, address='湖北武当山')
data = json.dumps(d)
print(data)
#把JSON写入文件
with open('data.json', 'w') as f:
json.dump(data, f)
运行结果:
{"name": "\u5f20\u4e09\u4e30", "age": 60, "address": "\u6e56\u5317\u6b66\u5f53\u5c71"}
要把JSON反序列化为Python对象,用loads()或者对应的load()方法,前者把JSON的字符串反序列化,后者从file-like Object中读取字符串并反序列化。
import json
json_str = '{"name": "\u5f20\u4e09\u4e30", "age": 60, "address": "\u6e56\u5317\u6b66\u5f53\u5c71"}'
data = json.loads(json_str)
print(data)
with open('data.json', 'r') as f:
print(json.load(f))
运行结果:
{'name': '张三丰', 'age': 60, 'address': '湖北武当山'}
{"name": "\u5f20\u4e09\u4e30", "age": 60, "address": "\u6e56\u5317\u6b66\u5f53\u5c71"}
更多的情况下,我们更欢用class表示对象,比如定义Person类,然后序列化,但是需要我们自定义如何把Person类型转换为dict,同理,反序列化时我们也需要自定义如何把dict转换为Person类型。
实例:
# -*- coding: utf-8 -*-
# @Time : 2022/4/21 9:37
# @File : jsondemo.py
# @Software : PyCharm
import json
# python对象转dic
def person2dict(p):
return {
'name': p.name,
'gender': p.gender,
'address': p.address
}
# dict转python
def dict2person(d):
return Person(d['name'], d['gender'], d['address'])
class Person(object):
def __init__(self, name, gender, address):
self.name = name
self.gender = gender
self.address = address
p = Person('张三丰', '男', '湖北武当山')
# python对象转json
json_data = json.dumps(p, default=person2dict)
print(json_data)
# json转python对象
obj = json.loads(json_data, object_hook=dict2person)
print(obj)
print("name:", obj.name, " gender:", obj.gender, " address:", obj.address)
运行结果:
{"name": "\u5f20\u4e09\u4e30", "gender": "\u7537", "address": "\u6e56\u5317\u6b66\u5f53\u5c71"}
<__main__.Person object at 0x000002754D0482E0>
name: 张三丰 gender: 男 address: 湖北武当山
小结:
Python语言特定的序列化模块是pickle,而使用json模块可以实现序列化为json格式的数据,这样更符合web规范。json模块的dumps()和loads()是分别实现序列化和反序列的函数。