Python Json与pickle模块序列化使用介绍

叶初
叶初
发布时间:2026-10-16| 4人浏览过
原创

本文详细介绍Python中Json与pickle两个序列化模块。Json用于字符串与通用数据类型的转换,支持跨语言交互;Pickle用于Python特有类型及复杂对象的序列化,仅限Python使用。文章对比dumps、dump、loads、load四个核心功能,并通过代码示例演示文件读写、函数序列化及常见报错原因,帮助开发者掌握数据持久化技巧。

Json与Pickle模块概述

在Python开发中,数据序列化主要依赖两个核心模块。

  • Json模块主要负责字符串与Python基础数据类型之间的相互转换。
  • Pickle模块则专注于Python特有数据类型与Python数据结构之间的转换。

Json模块提供了四个主要功能:dumps、dump、loads和load。

Pickle模块同样提供了四个对应功能:dumps、dump、loads和load。

Json.dumps的作用是将数据转换为所有编程语言都能识别的字符串格式。

Json.dump的功能是将数据转换为通用字符串格式,并直接写入文件。

Pickle.dumps的作用是将数据转换为仅Python语言能识别的字符串格式。

Pickle.dump的功能是将数据转换为Python专用字符串格式,并直接写入文件。

Json序列化与反序列化实战

以下是Json序列化的具体示例。

Json序列化过程演示。

# json是所有语言中都通用的,适用于不同语言进行数据交互。
# 但json只能处理简单的数据类型,如果要处理复杂的,可以使用pickle
# 应用场景举例:当你使用虚拟机(或者玩游戏)时,中间你突然有点别的事情,于是要将虚拟机挂起,以便下次使用时还是现在的状态。
# 于是就用到了json,json序列化将虚拟机目前的状态(比如进行了什么操作,打开了什么文件)保存在文件中,
# 当你干完别的事,再次启动虚拟机时,json反序列化会将文件中保存的状态从文件中读出来,于是你就可以继续上次的操作了。
# dump和load配合使用可以实现序列化和反序列化,
# 在Python2中可以dump很多次,也可以load很多次,他们一一对应,但是其实这没什么意义
# 但在Python3中,可以dump很多次,但是当dump多次时,load会报错,所以记住在Python3中永远不要dump多次
import json
info = { "name":"Alex", "age":22 }
with open('text.txt','w',encoding='utf-8') as f:
    #f.write(info) #报错,字典不能写入文件中,字符串能写入文件中
    #f.write(str(info)) #太low了
    print(type(json.dumps(info)))  # <class 'str'>
    #f.write( json.dumps(info) ) # 高级做法1
    json.dump(info,f)  # 高级做法2,同上

Json反序列化过程演示。

import json
with open('text.txt','r',encoding='utf8') as f:
    #data=json.loads(f.read())
    data=json.load(f) #同上
    print(data["age"])

Pickle序列化与反序列化详解

以下是Pickle序列化的具体示例。

Pickle序列化过程演示。

虽然Pickle写入文件后显示为乱码,但这并非加密,而是遵循其内部语法规则的结果。

Pickle具备序列化所有Python数据类型的能力。

然而,Pickle序列化的数据仅限Python环境使用,其他编程语言无法识别。

import pickle
def sayhi(name):
    print("Hello ",name)
info = { "name":"Alex", "age":22, 'func':sayhi }
with open('text2.txt','wb') as f:
    print(type(pickle.dumps(info)))  # <class 'bytes'>
    f.write( pickle.dumps(info) ) # sayhi是一个内存地址,用json序列化就写不到文件中,会报错

Pickle反序列化过程演示。

import pickle
# def sayhi(name):
#     print("Hello2 ",name)
with open('text2.txt','rb') as f:
    data=pickle.loads(f.read()) # 报错
    print(data)
    # data["func"]('alex')
# AttributeError: Can't get attribute 'sayhi' on <module '__main__' from 'D:/python-study/s14/Day04/pickle反序列化.py'>

报错原因在于sayhi是一个内存地址,当Pickle序列化.py程序执行完毕后,该内存地址即被释放,导致无法找回。

此处旨在说明:Pickle可以序列化所有数据类型,无论该数据是否支持反序列化。

若希望避免报错,可将sayhi函数的定义代码复制过来,并且该函数仍可正常执行。

只要保证函数名称一致即可避免报错,函数体内容可以完全不同。

Json字符串自动转换功能

Json模块的另一个重要作用是:根据字符串的书写格式,自动将其转换为相应的数据类型。

import json
# Python3.x中input方法获取到的都是字符串,相当于Python2.x中的raw_input
inp_str = input("请输入:") # 输入一个列表,[1,2,3]
print(type(inp_str)) # <class 'str'>
inp_str = json.loads(inp_str,encoding="UTF-8") # 根据字符串书写格式,将字符串自动转换成 列表类型
print(type(inp_str),inp_str[0]) # <class 'list'> 1
inp_str = input("请输入:") # 输入一个字典,{"name":"Rose","age":21,"sex":"F"}
                             # 切记,字典内部必须是 双引号 !!!单引号会报错。
print(type(inp_str)) # <class 'str'>
inp_str = json.loads(inp_str,encoding="UTF-8") # 根据字符串书写格式,将字符串自动转换成 字典类型
print(type(inp_str),inp_str['name'],inp_str['age'],inp_str['sex']) # <class 'dict'> Rose 21 F

至此,关于Python Json与pickle模块序列化的介绍已完成,更多相关内容请查阅本站过往文章或继续浏览后续内容,感谢支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。