当前位置:首页 > Python > 正文

Python序列化与反序列化详解(小白也能轻松掌握的pickle和JSON用法)

在日常的Python开发中,我们经常会遇到需要将数据保存到文件、通过网络传输数据,或者从存储中恢复数据的需求。这时,Python序列化Python反序列化就显得尤为重要。本文将带你从零开始,深入浅出地理解这两个概念,并通过实际代码示例掌握如何使用pickle模块JSON序列化来处理各种数据。

什么是序列化与反序列化?

简单来说:

  • 序列化(Serialization):将内存中的对象转换为可存储或可传输的格式(如字节流、字符串等)。
  • 反序列化(Deserialization):将序列化后的数据还原为原始的Python对象。
Python序列化与反序列化详解(小白也能轻松掌握的pickle和JSON用法) Python序列化  Python反序列化 pickle模块 JSON序列化 第1张

方法一:使用pickle模块进行序列化

pickle 是Python内置的标准库,专门用于对Python对象进行二进制序列化。它支持几乎所有Python数据类型(如列表、字典、类实例等)。

1. 序列化(dump / dumps)

import pickle# 要序列化的数据data = {    'name': '小明',    'age': 25,    'skills': ['Python', '数据分析']}# 方法1:写入文件(使用 dump)with open('data.pkl', 'wb') as f:    pickle.dump(data, f)# 方法2:转为字节字符串(使用 dumps)serialized_data = pickle.dumps(data)print(serialized_data)  # 输出的是二进制字节

2. 反序列化(load / loads)

import pickle# 从文件读取并反序列化with open('data.pkl', 'rb') as f:    restored_data = pickle.load(f)    print(restored_data)# 从字节字符串反序列化original_data = pickle.loads(serialized_data)print(original_data)

⚠️ 注意:pickle 仅适用于Python环境,且存在安全风险——不要反序列化不可信的数据!

方法二:使用JSON进行序列化

JSON(JavaScript Object Notation)是一种轻量级、语言无关的数据交换格式,广泛用于Web开发和API通信。Python通过内置的 json 模块支持JSON序列化。

1. 序列化(dump / dumps)

import jsondata = {    'name': '小明',    'age': 25,    'skills': ['Python', '数据分析']}# 写入JSON文件with open('data.json', 'w', encoding='utf-8') as f:    json.dump(data, f, ensure_ascii=False, indent=4)# 转为JSON字符串json_str = json.dumps(data, ensure_ascii=False, indent=2)print(json_str)

2. 反序列化(load / loads)

import json# 从文件读取with open('data.json', 'r', encoding='utf-8') as f:    restored = json.load(f)    print(restored)# 从字符串解析original = json.loads(json_str)print(original)

pickle vs JSON:如何选择?

特性 pickle JSON
支持的数据类型 几乎所有Python对象(包括自定义类) 基本类型(dict, list, str, int, float, bool, None)
跨语言兼容性 仅限Python 几乎所有编程语言都支持
安全性 不安全(可执行任意代码) 安全(纯数据格式)
输出格式 二进制 文本(可读性强)

总结

通过本教程,你已经掌握了 Python序列化Python反序列化 的核心概念,并学会了如何使用 pickle模块JSON序列化 来处理数据。记住:

  • 内部Python程序间通信 → 优先考虑 pickle
  • Web API、跨语言系统 → 必须使用 JSON

希望这篇教程能帮助你轻松上手序列化操作!如有疑问,欢迎在评论区交流。