🌟 导读欢迎来到 Python 学习的第二十五站。
之前我们学习了用 write() 往文件里写文字。但是,如果你手里有一个装满了几千个用户信息的字典(Dict)或者列表(List),该怎么存进文件里呢? 有新手可能会说:“简单啊,用 str() 把它强制变成字符串,再写进去不就行了?” ——存进去确实容易,但等你下次读出来的时候,它就彻底变成了一串死板的文字,再也无法像真正的字典那样用 键 来查找数据了!
为了解决这个痛点,我们需要一种能把数据**“原汁原味冻结保存”,以后还能“完美解冻复原”的魔法。这在编程界叫作“数据序列化(Serialization)”**。 今天,我们将学习 Python 中两大序列化神器:JSON 和 Pickle!🚀
🌐 1. 互联网的通用语言:JSON 模块
什么是 JSON? JSON 是一种极其轻量、结构清晰的数据格式。最关键的是,它是跨语言的!Python 认识它,Java、C++、网页前端(JavaScript)统统认识它。只要你的数据需要通过网络传给别人,首选绝对是 JSON!
在 Python 中,处理 JSON 只需要导入自带的 json 模块。
① 字符串变身:dumps() 与 loads()带 s 的方法代表处理的是 String(字符串)。
import jsonuser_dict = {"name": "张三", "age": 25, "is_vip": True}# 🧊 序列化(冻结):把字典变成 JSON 格式的字符串json_str = json.dumps(user_dict, ensure_ascii=False)print("变成JSON字符串啦:", json_str)# ⚠️ 必踩坑预警:ensure_ascii=False 极其重要!如果不加它,你的中文就会变成 \u5f20\u4e09 这种人类看不懂的火星文!# 🔥 反序列化(解冻):把 JSON 字符串变回真正的字典real_dict = json.loads(json_str)print("解冻成功,变回字典,依然可以通过键获取值:", real_dict["name"])
② 文件变身:dump() 与 load()如果不带 s,就代表直接和文件打交道。它把“转换”和“写入”两步合二为一,超级方便!
import jsondata = ["苹果", "香蕉", "西瓜"]# 🧊 直接把列表冻结并存入文件 (普通 "w" 模式即可)with open("data.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False)# 🔥 从文件中直接解冻出列表 (普通 "r" 模式即可)with open("data.json", "r", encoding="utf-8") as f: loaded_data = json.load(f) print("从文件读出的列表:", loaded_data)
🥒 2. Python 的私人保险箱:Pickle 模块
JSON 虽然是通用语言,但它也有缺点:它只能保存字典、列表、数字、字符串等基础类型。 如果你在上一章写了一个 Dog类(Class),并且造了一只极其复杂的机器狗对象,JSON 看了直接连连摇头:“这个太高级了,我存不了!”
这时候,就要请出 Python 的独门秘籍——pickle(泡菜)模块。
什么是 Pickle?它是 Python 独有的序列化工具。它能把你代码里的任何东西(包括你自定义的类、复杂的对象实例)强制腌制成泡菜(二进制数据)存起来!
⚠️ 核心注意:因为 Pickle 处理的是底层数据,所以读写文件时,必须使用上节课学过的 wb(覆盖写二进制)和 rb(读二进制)模式!
import pickle# 假设我们定义了一个复杂的小狗类,并造了一只狗class Dog: def __init__(self, name, skills): self.name = name self.skills = skillsmy_dog = Dog("旺财", ["跑", "跳", "抓飞盘"])# 🥒 腌制(序列化对象并存入文件):注意必须用 wb!with open("dog_backup.pkl", "wb") as f: pickle.dump(my_dog, f) print("旺财已经被成功冻结保存啦!")# 💧 解冻(从文件复原对象):注意必须用 rb!with open("dog_backup.pkl", "rb") as f: recovered_dog = pickle.load(f) print(f"解冻成功!这只狗叫:{recovered_dog.name}") print(f"它会的技能有:{recovered_dog.skills}")
🛡️ 安全警告: Pickle 具有极大的威力,但只懂 Python 的方言。永远不要用 pickle.load() 去解冻一个来源不明的、别人发给你的 .pkl 文件!黑客可以在里面藏入恶意代码,一旦解冻,代码就会在你电脑上偷偷执行!
📊 总结时刻:JSON vs Pickle 怎么选?
为了让大家在工作中不迷茫,主编整理了选择指南:
对比维度 | JSON 🌐 | Pickle 🥒 |
|---|
通用性 | 极强!所有编程语言都认识 | 极弱。只有 Python 认识 |
能存什么 | 只能存字典、列表、基础数字文字 | 几乎万物皆可存(包括对象、类) |
文件模式 | 纯文本模式(w / r) | 二进制模式(wb / rb) |
可读性 | 用记事本打开能看懂 | 打开是一堆乱码 |
使用场景 | (95%的情况) 网络传输、给别人发数据 | (5%的情况) 临时保存自己程序里的复杂对象 |
👇 互动时间
假设你现在在一家游戏公司上班。你用 Python 写了游戏的服务端,现在你需要把玩家当前的“血量、金币、等级”发送给用 JavaScript 写的网页前端进行显示。
请问,在这个场景下,你应该把玩家数据序列化成哪种格式发送出去?A. Pickle (因为它能存各种复杂的对象) B. JSON (因为前端不认识 Pickle,只认识跨语言的 JSON) C. 直接转成普通字符串发送