Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain

6.5 json 与 pickle 模块

概述

在 Python 中,json 和 pickle 是两个常用的模块,用于数据的序列化和反序列化。它们可以将 Python 对象转换为可存储或传输的格式,并在需要时重新恢复为 Python 对象。尽管它们的功能相似,但它们的应用场景和特性有所不同。

1. json 模块

json 模块用于处理 JSON(JavaScript Object Notation)格式的数据。JSON 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。

1.1 序列化与反序列化
  • 序列化:将 Python 对象转换为 JSON 字符串。

    import json
    
    data = {
        "name": "Alice",
        "age": 30,
        "is_student": False,
        "courses": ["Math", "Science"]
    }
    
    json_str = json.dumps(data)
    print(json_str)
    
  • 反序列化:将 JSON 字符串转换为 Python 对象。

    json_str = '{"name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"]}'
    data = json.loads(json_str)
    print(data)
    
1.2 文件操作

json 模块还提供了直接从文件读取和写入 JSON 数据的功能。

  • 写入文件:

    with open('data.json', 'w') as f:
        json.dump(data, f)
    
  • 读取文件:

    with open('data.json', 'r') as f:
        data = json.load(f)
    
1.3 高级用法
  • 自定义序列化:可以通过 default 参数指定一个函数来处理无法直接序列化的对象。

    def custom_serializer(obj):
        if isinstance(obj, set):
            return list(obj)
        raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
    
    data = {"name": "Alice", "hobbies": {"reading", "traveling"}}
    json_str = json.dumps(data, default=custom_serializer)
    
  • 美化输出:使用 indent 参数可以使 JSON 输出更具可读性。

    json_str = json.dumps(data, indent=4)
    

2. pickle 模块

pickle 模块用于序列化和反序列化 Python 对象。与 json 不同,pickle 可以处理几乎所有的 Python 对象,包括自定义类和函数。

2.1 序列化与反序列化
  • 序列化:将 Python 对象转换为字节流。

    import pickle
    
    data = {
        "name": "Alice",
        "age": 30,
        "is_student": False,
        "courses": ["Math", "Science"]
    }
    
    byte_stream = pickle.dumps(data)
    
  • 反序列化:将字节流转换回 Python 对象。

    data = pickle.loads(byte_stream)
    
2.2 文件操作

pickle 模块也支持直接从文件读取和写入序列化数据。

  • 写入文件:

    with open('data.pkl', 'wb') as f:
        pickle.dump(data, f)
    
  • 读取文件:

    with open('data.pkl', 'rb') as f:
        data = pickle.load(f)
    
2.3 注意事项
  • 安全性:pickle 模块在反序列化时会执行任意代码,因此不应反序列化来自不可信来源的数据。
  • 兼容性:pickle 生成的字节流是 Python 特有的,不同版本的 Python 之间可能存在兼容性问题。

3. json 与 pickle 的比较

特性jsonpickle
数据格式文本格式(JSON)二进制格式
可读性高低
安全性安全不安全
支持的数据类型基本数据类型、列表、字典等几乎所有 Python 对象
跨语言兼容性是否

4. 应用场景

  • json:适用于需要跨语言交换数据的场景,如 Web API 的数据传输。
  • pickle:适用于需要保存和恢复 Python 对象状态的场景,如机器学习模型的持久化。

5. 总结

json 和 pickle 模块在 Python 中扮演着重要的角色,分别适用于不同的场景。json 更适合于跨平台和跨语言的数据交换,而 pickle 则更适合于 Python 内部的复杂对象序列化。在实际开发中,应根据具体需求选择合适的模块。

Last Updated:: 3/17/25, 7:20 PM