Python:序列化

在Python中,序列化是指将对象的状态转换为可以存储或传输的形式的过程。反序列化则是将这些形式的数据恢复成原始对象的过程。Python提供了多种序列化和反序列化的工具,其中最常用的是 pickle 和 json 模块。

1. pickle 模块

pickle 模块可以将几乎任何Python对象转换为字节流(序列化),也可以将字节流恢复为原来的对象(反序列化)。pickle 主要用于Python内部对象的序列化。

序列化(Dumping)
python 复制代码
import pickle

# 定义一个对象
data = {
    'name': 'Alice',
    'age': 30,
    'is_student': False
}

# 序列化对象到文件
with open('data.pickle', 'wb') as file:
    pickle.dump(data, file)

# 序列化对象到字符串
data_str = pickle.dumps(data)
print(data_str)
反序列化(Loading)
python 复制代码
import pickle

# 从文件中反序列化对象
with open('data.pickle', 'rb') as file:
    loaded_data = pickle.load(file)
print(loaded_data)

# 从字符串中反序列化对象
loaded_data_str = pickle.loads(data_str)
print(loaded_data_str)

2. json 模块

json 模块用于处理JSON数据。JSON是一种轻量级的数据交换格式,广泛用于网络数据传输。json 模块可以将Python对象转换为JSON格式的字符串,也可以将JSON格式的字符串转换回Python对象。

序列化(Dumping)
python 复制代码
import json

# 定义一个对象
data = {
    'name': 'Alice',
    'age': 30,
    'is_student': False
}

# 序列化对象到文件
with open('data.json', 'w') as file:
    json.dump(data, file)

# 序列化对象到字符串
data_str = json.dumps(data)
print(data_str)
反序列化(Loading)
python 复制代码
import json

# 从文件中反序列化对象
with open('data.json', 'r') as file:
    loaded_data = json.load(file)
print(loaded_data)

# 从字符串中反序列化对象
loaded_data_str = json.loads(data_str)
print(loaded_data_str)

对比

  • pickle:

    • 支持更复杂的Python对象,如自定义类实例。
    • 序列化后的数据是二进制格式,不适合在网络上传输。
    • 不安全,反序列化不受信任的数据可能导致安全问题。
  • json:

    • 支持的数据类型较为有限,主要支持基本的Python数据类型(如字典、列表、字符串、数字、布尔值、None)。
    • 序列化后的数据是文本格式,适合在网络上传输。
    • 相对安全,因为JSON格式的数据不容易被恶意利用。

其他序列化模块

除了 pickle 和 json,Python还有一些其他的序列化模块,如 yaml 和 xml,适用于特定的场景。

yaml 模块

yaml 模块可以处理YAML格式的数据。YAML是一种人类可读的数据序列化语言,常用于配置文件。

python 复制代码
import yaml

# 定义一个对象
data = {
    'name': 'Alice',
    'age': 30,
    'is_student': False
}

# 序列化对象到字符串
data_str = yaml.dump(data)
print(data_str)

# 反序列化对象
loaded_data = yaml.safe_load(data_str)
print(loaded_data)
xml.etree.ElementTree 模块

xml.etree.ElementTree 模块可以处理XML格式的数据。XML是一种标记语言,常用于结构化数据的存储和传输。

python 复制代码
import xml.etree.ElementTree as ET

# 创建一个XML元素
root = ET.Element('root')
ET.SubElement(root, 'name').text = 'Alice'
ET.SubElement(root, 'age').text = '30'
ET.SubElement(root, 'is_student').text = 'False'

# 序列化对象到字符串
data_str = ET.tostring(root, encoding='unicode')
print(data_str)

# 解析XML字符串
root = ET.fromstring(data_str)
name = root.find('name').text
age = int(root.find('age').text)
is_student = root.find('is_student').text == 'True'

print(name, age, is_student)

选择合适的序列化模块取决于具体需求,比如数据的复杂性、传输的格式和安全性要求等。

相关推荐
第九序言T2 分钟前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路9 分钟前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_4260039613 分钟前
UI自动化高频次登录login限流解决方案
python·ui·自动化
Sakura_j_h_32 分钟前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川1 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人1 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
quantdash_cc2 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
I Am a robert girl2 小时前
当智能体学会“串通”:从长程交互中读懂涌现式合谋
python·多智能体系统·多智能体协作·llm agent·涌现式合谋·对齐问题·激励机制设计
Raas1002 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
云和数据.ChenGuang2 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain