Python - 序列化

大家好,未来的Python大师们!今天,我们将深入探讨序列化的迷人世界。不要担心这个词听起来吓人——在本课结束时,您将能够像专业人士一样对数据进行序列化!让我们一起踏上这个激动人心的旅程。

Python - Serialization

Python中的序列化

想象一下您正在为旅行打包。您需要将所有的物品装进一个手提箱。这正是序列化对数据所做的——它将数据整齐地打包起来,以便可以存储或发送到其他地方。在Python的术语中,序列化是将复杂数据结构转换成一种易于存储或传输格式的过程。

您可能会问,为什么这很重要?好吧,假设您创建了一个出色的Python程序,它生成了您最喜欢的电影列表。您想保存这个列表,以便以后使用或发送给朋友。序列化使您能够做到这一点!

Python中的序列化库

Python作为一个慷慨的语言,为我们提供了几个用于序列化的库。这就像为不同的旅行提供不同类型的手提箱一样。让我们看看最常见的一些:

描述
Pickle Python内置的序列化模块
JSON JavaScript对象表示法,非常适合Web应用程序
YAML YAML不是标记语言,是一种人类可读的格式

我们将详细探讨每一个,但首先让我们从最Python特定的一个开始:Pickle。

使用Pickle模块进行序列化

Pickle是Python进行序列化的首选模块。它就像一把瑞士军刀——多功能且内置在Python中。让我们看看它是如何工作的:

import pickle

# 我们最喜欢的电影列表
favorite_movies = ['黑客帝国', '星球大战', '魔戒']

# 序列化列表
with open('movies.pkl', 'wb') as file:
pickle.dump(favorite_movies, file)

print("电影列表已序列化!")

在这个例子中,我们正在将我们最喜欢的电影列表“腌制”。dump() 函数在这里做重活,将我们的列表转换成二进制格式并保存到名为'movies.pkl'的文件中。

现在,让我们看看如何找回我们的列表:

# 反序列化列表
with open('movies.pkl', 'rb') as file:
loaded_movies = pickle.load(file)

print("反序列化后的电影列表:", loaded_movies)

瞧!我们已经成功打开了我们的手提箱(或者在这个例子中,是我们的腌菜罐)。load() 函数读取二进制文件,并将其转换回Python对象。

Pickle协议

Pickle使用所谓的“协议”来确定如何序列化对象。将这些视为您手提箱的不同包装方法。Python 3支持5种协议(从0到4),数字越高越高效,但可能与旧版本的Python兼容性较差。

import pickle

data = {'name': 'Alice', 'age': 30}

# 使用协议4(Python 3中最有效的)
serialized = pickle.dumps(data, protocol=4)
print("序列化后的数据:", serialized)

# 反序列化
deserialized = pickle.loads(serialized)
print("反序列化后的数据:", deserialized)

在这个例子中,我们使用dumps()将数据序列化为字符串而不是文件,并指定协议4以实现最大效率。

Pickler和Unpickler类

为了更控制序列化过程,Python提供了Pickler和Unpickler类。这些就像您自己的个人打包助手:

import pickle

class PickleHelper:
def __init__(self, filename):
self.filename = filename

def save_data(self, data):
with open(self.filename, 'wb') as file:
pickler = pickle.Pickler(file)
pickler.dump(data)

def load_data(self):
with open(self.filename, 'rb') as file:
unpickler = pickle.Unpickler(file)
return unpickler.load()

# 使用
helper = PickleHelper('data.pkl')
helper.save_data(['苹果', '香蕉', '樱桃'])
loaded_data = helper.load_data()
print("加载数据:", loaded_data)

这个PickleHelper类提供了一个更面向对象的序列化方法,这在大型项目中可能非常有用。

序列化自定义类对象

现在,让我们来处理一些更高级的内容——序列化自定义类对象。假设我们有一个Person类:

import pickle

class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def greet(self):
return f"你好,我的名字是{self.name},我{self.age}岁。"

# 创建一个Person对象
alice = Person("Alice", 30)

# 序列化对象
with open('person.pkl', 'wb') as file:
pickle.dump(alice, file)

# 反序列化对象
with open('person.pkl', 'rb') as file:
loaded_alice = pickle.load(file)

print(loaded_alice.greet())  # 输出:你好,我的名字是Alice,我30岁。

这难道不酷吗?我们刚刚将一个完整的人打包到一个文件中,然后又重新解包!

使用JSON进行序列化

虽然Pickle对于Python特定的序列化很棒,但有时我们需要与其他语言或系统交互。这时JSON就派上用场了。它就像数据的通用语言:

import json

# 要序列化的数据
data = {
"name": "Bob",
"age": 35,
"city": "New York",
"hobbies": ["阅读", "游泳", "编码"]
}

# 序列化为JSON
json_string = json.dumps(data, indent=4)
print("JSON字符串:", json_string)

# 从JSON反序列化
parsed_data = json.loads(json_string)
print("解析后的数据:", parsed_data)

JSON特别适用于Web应用程序和API,因为它在不同的平台上有广泛的支

Credits: Image by storyset