python序列化数据_选择合适格式保存字典、列表、对象实例方案
发布时间 - 2026-02-02 00:00:00 点击率:次最省事的是pickle,但仅限同版本Python可信环境;跨语言或配置用json(需处理特有类型);大体积数据选msgpack;复杂函数用cloudpickle。
用 pickle 保存 Python 原生对象最省事,但别跨语言或跨版本读
pickle 是 Python 自带的序列化模块,能直接存 dict、list、自定义类实例(只要没含不可序列化属性,比如文件句柄、lambda 函数)。它速度快、保留类型和引用关系,适合纯 Python 环境下的临时缓存或进程间传递。
常见错误是把 pickle 文件发给其他语言程序读,或者用 Python 3.8 的 pickle 协议保存后,在 Python 3.6 上加载失败——协议版本不兼容会直接报 ValueError: unsupported pickle protocol。
实操建议:
只在可信的 Python 环境内使用,不用于网络传输或用户输入场景(反序列化任意
pickle数据有远程代码执行风险)- 显式指定协议版本,例如
pickle.dump(obj, f, protocol=pickle.HIGHEST_PROTOCOL),避免默认用低版本协议限制功能 - 若对象含
__slots__、__getstate__等定制逻辑,需确认其行为符合预期,否则可能漏字段
存配置或跨语言数据优先选 json,但得先处理 Python 特有类型
json 格式通用、可读性强、几乎所有语言都支持,适合保存配置、API 响应、前端交互数据。但它只认基本类型:dict、list、str、int、float、bool、None。遇到 datetime、set、自定义类实例就会报 TypeError: Object of type X is not JSON serializable。
实操建议:
- 用
default参数自定义转换逻辑,例如把datetime转成 ISO 字符串:json.dump(obj, f, default=lambda x: x.isoformat() if hasattr(x, 'isoformat') else str(x)) - 避免在
default里做复杂判断或递归处理,容易掩盖真实类型错误;更稳妥的做法是提前把对象“扁平化”为 JSON 友好结构 - 注意
json不保留顺序(Python 3.7+dict有序,但 JSON 规范本身不保证),也不区分tuple和list(都转成数组)
需要压缩或大体积数据时,msgpack 比 json 更紧凑且快
msgpack 是二进制格式,体积通常比 JSON 小 30%–50%,解析速度也更快,同时支持更多原生类型(如 bytes、datetime,需开启 strict_map_key=False 或用 ext 类型扩展)。它不像 pickle 那样危险,但 Python 外的支持程度不如 JSON(比如某些嵌入式环境或旧版 JS 库可能没 msgpack 解析器)。
实操建议:
- 安装后直接用:
import msgpack; msgpack.pack(obj, f),读取用msgpack.unpack(f) - 如果数据含
numpy数组,msgpack默认不支持,得配合msgpack-numpy扩展,否则会报TypeError: can't serialize - 写入时加
use_bin_type=True,否则 Python 3 下bytes可能被当str处理,导致读取错乱
保存带方法或状态的类实例,cloudpickle 比 pickle 更可靠
标准 pickle 对定义在交互式环境(如 Jupyter、IPython)或局部作用域里的函数/类会失败,报 AttributeError: Can't pickle local object。cloudpickle 专门解决这个问题,能把 lambda、闭包、动态生成的类等一并序列化。
实操建议:
- 安装后替换导入:
import cloudpickle as pickle,其余用法和标准pickle一致 - 它仍不能序列化 C 扩展对象(如某些
sqlite3.Connection)、打开的文件、线程锁等资源型对象,这类必须手动清理或替换为可序列化的占位符 - 跨机器加载时,确保目标环境有完全相同的依赖版本,否则反序列化可能因找不到模块路径而失败
真正麻烦的不是选哪种格式,而是混用时没统一处理边界:比如用 json 存时间却忘了转字符串,或用 pickle 传对象到另一台机器却发现 Python 版本差了一点点。这些细节不显眼,但出问题时往往卡半天。
# python
# js
# 前端
# json
# 作用域
# numpy
# ipython
# Float
# Object
# if
# 字符串
# 递归
# bool
# int
# Lambda
# 线程
# 闭包
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么调用外部API_Laravel Http Client客户端使用
如何批量查询域名的建站时间记录?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
独立制作一个网站多少钱,建立网站需要花多少钱?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Laravel Fortify是什么,和Jetstream有什么关系
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Java垃圾回收器的方法和原理总结
网站页面设计需要考虑到这些问题
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
微信小程序 配置文件详细介绍
googleplay官方入口在哪里_Google Play官方商店快速入口指南
如何快速查询网址的建站时间与历史轨迹?
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
高端智能建站公司优选:品牌定制与SEO优化一站式服务
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
如何在橙子建站上传落地页?操作指南详解
怎样使用JSON进行数据交换_它有什么限制
如何快速配置高效服务器建站软件?
如何快速打造个性化非模板自助建站?
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
微信小程序 wx.uploadFile无法上传解决办法
BootStrap整体框架之基础布局组件
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何在阿里云高效完成企业建站全流程?
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
使用豆包 AI 辅助进行简单网页 HTML 结构设计
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何快速重置建站主机并恢复默认配置?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
javascript基本数据类型及类型检测常用方法小结
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
JavaScript如何实现路由_前端路由原理是什么
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Laravel如何处理和验证JSON类型的数据库字段
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Swift中switch语句区间和元组模式匹配
什么是javascript作用域_全局和局部作用域有什么区别?
下一篇:南通地铁app如何查询路线
下一篇:南通地铁app如何查询路线


