小甲鱼Python学习笔记

课程主题

  • 讲师:小甲鱼
  • 内容:Python pickle模块——复杂数据类型的持久化存储
  • 核心痛点:普通文件读写仅支持字符串,无法直接保存列表、字典等复杂对象

pickle模块核心概念

  • 模块定位:Python标准模块,实现任意对象与二进制流的相互转换
  • 核心术语
    1. pickling:对象→二进制流(序列化、腌制)
    2. unpickling:二进制流→对象(反序列化、解封)
  • 模块优势:可直接保存列表、字典、集合、类实例等复杂数据,无需手动转换为字符串

pickle模块核心操作:保存(pickling)

1. 操作步骤

  1. 导入模块:import pickle
  2. 定义需保存的复杂对象(如列表、字典)
    • 示例:my_list = [1, 2, 3, 3.14, "小甲鱼", ["another list"]]
  3. 二进制写入模式打开文件:pick_file = open("my_list.pkl", "wb")
    • 后缀建议:.pkl.pickle,仅作标识,不影响格式
  4. 写入对象:pickle.dump(对象, 文件对象)
    • 示例:pickle.dump(my_list, pick_file)
  5. 关闭文件:pick_file.close() → 必须关闭,避免数据丢失

2. 关键注意事项

  • 打开模式必须带b(二进制),否则报错
  • 保存后的文件是二进制格式,文本编辑器打开会显示乱码

pickle模块核心操作:读取(unpickling)

1. 操作步骤

  1. 导入模块:import pickle
  2. 二进制读取模式打开文件:pick_file = open("my_list.pkl", "rb")
  3. 读取对象:新对象 = pickle.load(文件对象)
    • 示例:my_list2 = pickle.load(pick_file)
  4. 关闭文件:pick_file.close()

2. 效果

  • 读取后的my_list2与原my_list内容完全一致,保留原数据类型

pickle模块的实际应用场景

核心场景:分离大型静态数据,简化代码

  • 问题案例:天气查询脚本中,city字典占代码99%体积,导致脚本臃肿(70KB)
  • 解决方案
    1. 单独编写脚本,将city字典腌制保存为city_data.pkl
import pickle
city = {"北京":101010100, ...} # 大型字典
f = open("city_data.pkl", "wb")
pickle.dump(city, f)
f.close()