百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

python进阶突破内置模块——数据序列化与格式

liuian 2025-06-12 14:11 34 浏览

数据序列化是将数据结构或对象转换为可存储/传输格式的过程,反序列化则是逆向操作。Python 提供了多种工具来处理不同场景下的序列化需求。


一、核心内置模块

1.json模块

最常用的轻量级数据交换格式,适用于跨语言交互。

基础用法

import json

data = {
    "name": "Alice",
    "age": 30,
    "skills": ["Python", "SQL"]
}

# 序列化为字符串
json_str = json.dumps(data, indent=2) 

# 序列化到文件
with open("data.json", "w") as f:
    json.dump(data, f)

# 反序列化
loaded_data = json.loads(json_str)
with open("data.json", "r") as f:
    loaded_data = json.load(f)

进阶功能

  • 处理复杂对象:自定义序列化逻辑
from datetime import datetime

class User:
    def __init__(self, name, join_date):
        self.name = name
        self.join_date = join_date

def custom_encoder(obj):
    if isinstance(obj, datetime):
        return obj.isoformat()
    elif isinstance(obj, User):
        return {"name": obj.name, "join_date": obj.join_date}
    raise TypeError("Type not serializable")

user = User("Bob", datetime.now())
json_str = json.dumps(user, default=custom_encoder, indent=2)

性能优化:使用 ujson 或 orjson 第三方库加速

2.pickle模块

Python 专用二进制序列化,支持几乎所有 Python 对象,但存在安全风险。

基础用法

import pickle

data = {"key": "value", "nums": [1, 2, 3]}

# 序列化到字节
bytes_data = pickle.dumps(data)

# 反序列化
loaded_data = pickle.loads(bytes_data)

# 文件操作
with open("data.pkl", "wb") as f:
    pickle.dump(data, f)

with open("data.pkl", "rb") as f:
    loaded_data = pickle.load(f)

注意事项

  • 安全警告:永远不要反序列化不可信来源的数据
  • 版本兼容性:不同 Python 版本的 pickle 文件可能不兼容
  • 自定义对象:需保证类定义在反序列化环境中可用

二、高级序列化场景

1. 处理复杂数据结构

循环引用处理

import json

data = {}
data["self_ref"] = data  # 循环引用

# 默认会报错,使用自定义处理
class CyclicEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, dict) and id(obj) in self.visited:
            return "<<循环引用>>"
        self.visited.add(id(obj))
        return super().default(obj)

encoder = CyclicEncoder()
encoder.visited = set()
json_str = encoder.encode(data)

2. 高性能二进制序列化

使用marshal(内置模块)

  • 专为 Python 字节码设计,性能极高
  • 但官方不保证跨版本兼容性
import marshal

data = {"a": 1, "b": [2, 3]}
bytes_data = marshal.dumps(data)
loaded_data = marshal.loads(bytes_data)

三、常用第三方库

1.msgpack

二进制格式,性能优于 JSON,跨语言支持。

import msgpack

data = {"name": "Charlie", "scores": [95, 88]}
packed = msgpack.packb(data)      # 序列化
unpacked = msgpack.unpackb(packed) # 反序列化

2.PyYAML

处理 YAML 格式,适合配置文件。

import yaml

config = """
database:
  host: localhost
  port: 3306
  users:
    - admin
    - guest
"""

data = yaml.safe_load(config)  # 安全加载
yaml_str = yaml.dump(data)     # 生成 YAML

3.protobuf

Google 的高效跨语言序列化方案。

// person.proto
syntax = "proto3";
message Person {
    string name = 1;
    int32 id = 2;
    repeated string emails = 3;
}
from person_pb2 import Person

person = Person(name="Alice", id=123)
person.emails.append("alice@example.com")
serialized = person.SerializeToString()  # 序列化

new_person = Person()
new_person.ParseFromString(serialized)   # 反序列化

四、性能对比与选型建议

格式/工具

可读性

速度

跨语言

适用场景

JSON

Web API、配置文件

Pickle

Python 内部数据持久化

MessagePack

很快

高性能网络通信

Protocol Buffers

极快

微服务通信、大数据存储

YAML

复杂配置文件

五、最佳实践

  1. 安全性优先
  • 永远不要使用 pickle 处理不可信数据
  • 使用 json.loads() 而非 eval() 解析 JSON
  1. 性能优化
  • 对大文件使用 json.load()/json.dump() 流式处理
  • 使用 orjson 替代标准 json 模块(性能提升3-10倍)
  1. 版本控制
  • 为序列化数据添加版本字段
{
    "version": "1.1",
    "data": {...}
}
  1. 处理日期时间
from datetime import datetime
from json import JSONEncoder

class DateTimeEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        return super().default(obj)

六、实战:自定义序列化协议

实现一个支持自定义类的序列化方案:

import json
from dataclasses import dataclass

@dataclass
class Product:
    id: int
    name: str
    price: float

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Product):
            return {"__product__": True, "id": obj.id, "name": obj.name, "price": obj.price}
        return super().default(obj)

def custom_decoder(dct):
    if "__product__" in dct:
        return Product(dct["id"], dct["name"], dct["price"])
    return dct

# 使用
product = Product(1, "Laptop", 999.9)
json_str = json.dumps(product, cls=CustomEncoder)
loaded = json.loads(json_str, object_hook=custom_decoder)
print(type(loaded))  # <class '__main__.Product'>

掌握这些工具和技术后,您将能够:

  • 在不同场景选择最优序列化方案
  • 处理复杂对象的序列化需求
  • 优化大规模数据的处理性能
  • 构建安全的跨系统数据交换方案

相关推荐

惠普台式机进入bios设置u盘启动
惠普台式机进入bios设置u盘启动

设置u盘启动的步骤如下:1、首先,将u盘插入hp台式机的USB接口处。2、开机快速断续的按F10键进入BIOS设置界面。3、将光标移到【BootDevicePriority】选项按回车键进入。4、选择【HDDGroupBootPr...

2026-01-15 00:37 liuian

云手机免费版无限挂机怎么用

1、登陆后,如果需要挂网页游戏,点击服务器的左下角,找到IE浏览器,然后打开网页游戏,登陆你的账号就行了,不要关闭IE浏览器,你的网页游戏就会24小时挂在云服务器上面。2、如果想要挂机,打开IE浏览器...

上海最近3天疫情情况(上海近几天的新冠疫情情况)

根据国家卫健委的每天疫情通报及上海市的疫情通报,上海没有一个区属中高风险地区,所以从上海任何一个区返乡都不需要隔离14天。上海这么大的城市,每天人来人往的Ill流不息,能继续做到区级地区没有中高级风险...

windows media player怎么下载

方法如下:在安装WMP11时只是把C:\DocumentsandSettings\AllUsers\ApplicationData\WindowsGenuineAdvantage\data...

during(during用法)

during用来表示一段时间,其意义大致相当于in的用法。一般来说,凡是能用in的地方,也可以用during.例如:Hecametoseemeduringmyabsence.Don’t...

深圳电脑城在哪里(深圳电脑卖场)

龙岗:世纪电脑城,平湖电脑城,京科电脑城坪山新区:坪山电脑城龙华:观澜电脑城,大浪电脑城,宏华电脑城,龙华电子城宝安区:赛格电子城,宝安电子城,丰明电脑城,沙井电子城龙岗中心区那边有两个电子城,...

电脑上怎么清理c盘垃圾(电脑里怎么清理c盘的东西)

C:\ProgramFiles\WindowsApps(隐藏文件夹)。打开“此电脑”,点击“查看”,勾选“隐藏的项目”,即可查看隐藏文件。为保证文件安全,此文件夹需要获取权限才能操作。获取方式...

手机哪个杀毒软件最好用

杀毒软件我有用过好几种用过之觉得体验感及安全性来说人喜欢推荐腾讯手机管家功能比较全面监控流量、查杀病毒、保护隐私等等界面也比较漂亮重点还要定期扫描同时也要轻易点开别人发链接之类软件有提示危险绝对要点开...

笔记本电脑怎样截图(苹果笔记本电脑怎样截图)
笔记本电脑怎样截图(苹果笔记本电脑怎样截图)

方法/步骤1第一个办法自然是我们最常见最简单的,使用“PrintScreen”键截图了。点击“PrintScreen”键,我们就可以直接截取全部屏幕,找个对话框或者文字区域粘贴就好了。我截的图是这样的2Windows系统都自带有截图工具,我...

2026-01-14 22:37 liuian

vaio笔记本u盘启动(hipaa笔记本u盘启动)

可能是u盘启动快捷键没有使用正确。因为笔记本型号不同,所以BIOS会有所不同,并且进入bios的启动快捷键也会不同。而索尼笔记本开机需要按F2键进入bios设置中。  2、在bios中没有正确设置u盘...

win7补丁更新在哪(win7系统补丁更新到几月)

答,方法如下1、点击开始菜单。在开始菜单键上面有三个图标,分别是;用户。设置。电源。点击其中的设置按钮。  2、接着,就打开了Windows设置窗口。点击最后一个“更新和安全”。  3、选择左侧列表中...

电脑主机怎么看配置高低(电脑主机配置高低判断)
  • 电脑主机怎么看配置高低(电脑主机配置高低判断)
  • 电脑主机怎么看配置高低(电脑主机配置高低判断)
  • 电脑主机怎么看配置高低(电脑主机配置高低判断)
  • 电脑主机怎么看配置高低(电脑主机配置高低判断)
大白菜启动盘下载(大白菜启动盘官网)

要在大白菜U盘上下载系统并创建启动盘,首先需要确保U盘的容量足够大以容纳整个系统镜像文件。然后,您可以从官方网站或可信的下载源获取所需的系统镜像文件,并使用专业的启动盘制作工具,如Rufus或UNet...

win10笔记本强制关机(windows10笔记本强制关机)

笔记本强制关机方法:1、按笔记本的电源键不松手,即可实现强制关机。2、一般涉及强制关机主要有死机、蓝屏、电脑运行程序无响应。强制关机后,笔记本电脑可能会出现非常卡的情况。这主要是因为在强制关机的过程中...

硬盘低级格式化软件哪个好(硬盘低级格式化对硬盘有损伤吗)

万能低格工具llftool好万能低格工具llftool是一款强大易用的硬盘低级格式化软件,支持硬盘、移动硬盘、内存卡、u盘等等存储设备的低格功能,过程快速方便,性能安全稳定。另外,...