授课语音

Python的序列化

1. 定义

在Python中,序列化是将对象转换为字节流,以便于存储或传输的过程。常见的序列化库包括:

  1. pickle: 可以将Python对象序列化为二进制格式,并在反序列化时恢复为原始对象。支持所有Python对象,但安全性较低。
  2. json: 将Python对象(如字典)序列化为JSON文本格式。JSON格式人类可读,且跨语言兼容,广泛应用于实际项目中;但不支持所有Python对象,如自定义类实例。
  3. marshal: 用于序列化Python内部对象,速度较快,适合基本数据类型;但不支持自定义实例。
  4. shelve: 类似于字典的数据库,将Python对象持久化存储,内部使用了pickle,但安全性较低。

2. 代码案例

# 1. 使用 pickle 库进行序列化和反序列化
import pickle

# 要序列化的数据,包含姓名、年龄和城市
data = {'name': 'Alice', 'age': 30, 'city': 'New York'}
try:
    # 以二进制写入模式打开文件
    with open('data.pkl', 'wb') as file:
        # 使用pickle的dump方法将数据写入文件
        pickle.dump(data, file)
    print("数据已序列化到 data.pkl")
except IOError as e:
    print(f"序列化失败: {e}")

# 反序列化对象从文件
try:
    # 以二进制读取模式打开文件
    with open('data.pkl', 'rb') as file:
        # 使用pickle的load方法从文件读取数据
        loaded_data = pickle.load(file)
    print(f"从 data.pkl 反序列化的数据: {loaded_data}")
except (IOError, pickle.PickleError) as e:
    print(f"反序列化失败: {e}")

# 2. 使用 json 库进行序列化和反序列化
import json

# 要序列化的数据
data = {'name': 'Bob', 'age': 25, 'city': 'Los Angeles'}
try:
    # 以写入模式打开JSON文件
    with open('data.json', 'w', encoding='utf-8') as file:
        # 使用json的dump方法将数据写入文件
        json.dump(data, file, ensure_ascii=False, indent=4)
    print("数据已序列化到 data.json")
except IOError as e:
    print(f"序列化失败: {e}")

# 反序列化对象从 JSON 文件
try:
    # 以读取模式打开JSON文件
    with open('data.json', 'r', encoding='utf-8') as file:
        # 使用json的load方法从文件读取数据
        loaded_data = json.load(file)
    print(f"从 data.json 反序列化的数据: {loaded_data}")
except (IOError, json.JSONDecodeError) as e:
    print(f"反序列化失败: {e}")

# 3. 使用 marshal 库进行序列化和反序列化
import marshal

# 要序列化的数据
data = {'name': 'Charlie', 'age': 35}
try:
    # 以二进制写入模式打开文件
    with open('data.marshal', 'wb') as file:
        # 使用marshal的dump方法将数据写入文件
        marshal.dump(data, file)
    print("数据已序列化到 data.marshal")
except IOError as e:
    print(f"序列化失败: {e}")

# 反序列化对象从文件
try:
    # 以二进制读取模式打开文件
    with open('data.marshal', 'rb') as file:
        # 使用marshal的load方法从文件读取数据
        loaded_data = marshal.load(file)
    print(f"从 data.marshal 反序列化的数据: {loaded_data}")
except (IOError, marshal.MarshalError) as e:
    print(f"反序列化失败: {e}")

# 4. 使用 shelve 库进行序列化和反序列化
import shelve

try:
    # 打开一个shelve数据库文件
    with shelve.open('data_shelve.db') as db:
        # 将数据存储到数据库中
        db['user'] = {'name': 'David', 'age': 40, 'city': 'San Francisco'}
    print("数据已序列化到 data_shelve.db")
except IOError as e:
    print(f"序列化失败: {e}")

# 反序列化对象从 shelve 文件
try:
    with shelve.open('data_shelve.db') as db:
        # 从数据库中读取数据
        loaded_data = db['user']
    print(f"从 data_shelve.db 反序列化的数据: {loaded_data}")
except (KeyError, IOError) as e:
    print(f"反序列化失败: {e}")

讲解内容

在以上代码中,我们展示了如何使用Python中的不同库进行对象的序列化和反序列化。通过使用pickle库,我们可以方便地将Python对象保存到文件中,并在需要时重新加载。使用json库,我们能够将数据转换为JSON格式,这种格式适合于网络传输和与其他编程语言的数据交互。

marshal库虽然速度较快,但不支持自定义对象,适合于基本数据类型。而shelve库则提供了一种字典式的方式来存储Python对象,方便我们进行持久化存储。

每种序列化方式都有其适用场景,理解它们的特点能够帮助我们在实际项目中做出合适的选择。

去1:1私密咨询

系列课程: