← 返回首页
Python3基础教程(五十三)
发表时间:2022-04-19 23:32:36
序列化

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()是分别实现序列化和反序列的函数。