序列化

Python SELF ZH
第 22 级 , 课程 0
可用

8.1 什么是序列化

在你学会了如何处理文件,保存和读取数据之后,现在是时候深入学习文件操作了。今天我们开始学习序列化。

序列化 是将对象转换为字节序列或格式的过程,可以将其保存到文件中,通过网络传输或保存在数据库中。反序列化 是相反的过程,从字节序列中重建原始对象。

要保存对象到文件(或通过网络传输),需要将其转换为容易写入文件(以及从文件中读取)或通过网络传输的字符串(或字节集)。

下面是序列化的四个主要用途:

  • 保存对象状态:为了在程序的不同运行之间保存对象的状态。
  • 数据传输:在系统的不同组件或不同系统之间传输对象。
  • 缓存:将对象保存在缓存中以便快速访问。
  • 数据库:在数据库中存储复杂的数据结构。

进行序列化的库非常多,每个库都有其特定的用途。我们将介绍五个库,其中两个将详细介绍。

让我们来看看最受欢迎的库:

  • 模块 pickle
  • 模块 json
  • 模块 yaml
  • 模块 marshal
  • 模块 shelve

下面是每个模块的简要概述:

8.2 模块 pickle

pickle 是一个用于 序列化反序列化 Python 对象的内置模块。它允许保存和恢复几乎任何 Python 对象,包括自定义类。

pickle 的使用示例:


import pickle

# 用于序列化的对象示例
data = {'name': 'Alice', 'age': 30, 'is_student': False}
            
# 将对象序列化到文件
with open('data.pkl', 'wb') as file:
    pickle.dump(data, file)
            
# 从文件反序列化对象
with open('data.pkl', 'rb') as file:
    loaded_data = pickle.load(file)
            
print(loaded_data)

8.3 模块 json

json 是一个用于处理 JSON(JavaScript Object Notation)的内置模块。JSON 是一种文本格式,用于客户端和服务器之间的数据交换。

json 的使用示例:


import json

# 用于序列化的对象示例
data = {'name': 'Bob', 'age': 25, 'is_student': True}
            
# 将对象序列化为 JSON 字符串
json_string = json.dumps(data)
print(json_string)
            
# 将对象序列化为 JSON 文件
with open('data.json', 'w') as file:
    json.dump(data, file)
            
# 从 JSON 字符串反序列化对象
loaded_data = json.loads(json_string)
print(loaded_data)
            
# 从 JSON 文件反序列化对象
with open('data.json', 'r') as file:
    loaded_data = json.load(file)
print(loaded_data)

8.4 模块 yaml

yaml (YAML Ain't Markup Language) 是一种可读性高的数据序列化格式。Python 中使用 PyYAML 库来处理 YAML。

yaml 的使用示例:


import yaml

# 用于序列化的对象示例
data = {'name': 'Carol', 'age': 27, 'is_student': False}
            
# 将对象序列化为 YAML 字符串
yaml_string = yaml.dump(data)
print(yaml_string)
            
# 将对象序列化为 YAML 文件
with open('data.yaml', 'w') as file:
    yaml.dump(data, file)
            
# 从 YAML 字符串反序列化对象
loaded_data = yaml.load(yaml_string, Loader=yaml.FullLoader)
print(loaded_data)
            
# 从 YAML 文件反序列化对象
with open('data.yaml', 'r') as file:
    loaded_data = yaml.load(file, Loader=yaml.FullLoader)
print(loaded_data)

8.5 模块 marshal

marshal 是一个用于序列化 Python 对象的内置模块,用于序列化 Python 代码。它比 pickle 更快,但支持的对象类型更少,也没有那么灵活。

marshal 的使用示例:


import marshal

# 用于序列化的对象示例
data = {'name': 'Dave', 'age': 35, 'is_student': True}

# 将对象序列化到文件
with open('data.marshal', 'wb') as file:
    marshal.dump(data, file)
            
# 从文件反序列化对象
with open('data.marshal', 'rb') as file:
    loaded_data = marshal.load(file)
            
print(loaded_data)

8.6 模块 shelve

shelve 是一个内置模块,提供了一种简单的方法来使用基于键的存储类似字典的方式将 Python 对象保存到文件。

shelve 的使用示例:


import shelve

# 用于序列化的对象示例
data = {'name': 'Eve', 'age': 28, 'is_student': False}
            
# 将对象序列化到文件
with shelve.open('data.shelve') as db:
    db['person'] = data
            
# 从文件反序列化对象
with shelve.open('data.shelve') as db:
    loaded_data = db['person']
            
print(loaded_data)

虽然模块和数据保存格式不同,但从程序员的角度来看,它们的使用非常相似。接下来,我们将更详细地介绍 模块 pickle模块 json 的使用。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION