You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python新手读取.pkl文件转TXT报UnpicklingError如何解决?

问题原因及解决方法

报错根因分析

  • 最常见的原因:该pkl模型是用joblib序列化生成的,而非标准库的pickle。多数机器学习框架(如scikit-learn)训练的模型默认采用joblib存储,对numpy数组等大数据结构的序列化效率更高,直接用pickle读取会触发格式不兼容报错。
  • 次要原因:序列化模型时使用的Python版本与当前运行的Python 3.7差异过大,比如Python 2生成的pkl文件未做兼容处理直接在Python 3中加载。
  • 原有代码还存在两处明显逻辑错误:
    1. 打开txt文件时用了rt只读模式,无法执行写入操作,需要改为写入模式
    2. pickle/joblib加载得到的是模型对象,不是字符串,不能直接调用write方法写入txt,需要先转为可打印的字符串格式

可直接运行的修复方案

方案1:使用joblib读取(优先尝试,适配绝大多数机器学习模型pkl文件)

先安装依赖:pip install joblib
然后运行以下代码:

import joblib
import os

model_path = input("Model Path = ")
# 加载模型
model_obj = joblib.load(model_path)
# 生成txt保存路径
new_model_path = model_path.rsplit('.pkl', 1)[0] + '.txt'
print("creating new file at : ", new_model_path)
# 写入txt,将模型对象转为字符串格式写入
with open(new_model_path, 'w', encoding='utf-8') as f:
    # 直接打印模型对象的可表示内容,也可以根据模型类型提取指定参数写入
    f.write(str(model_obj))
print("writing model as readable done")

方案2:兼容旧版本pickle文件

如果确认是标准pickle生成的文件,只是版本兼容问题,可以改用以下加载逻辑:

import pickle

model_path = input("Model Path = ")
with open(model_path, "rb") as model:
    # 增加兼容Python2生成的pkl文件的参数
    load = pickle.load(model, encoding='latin1', fix_imports=True)

补充说明

  • 如果以上两种方案都无法读取,可先执行file 你的pkl文件路径(Linux/Mac环境)查看文件实际格式,确认是否存在后缀名为pkl但实际为其他序列化格式的情况。
  • 直接输出全量模型对象到txt可读性较差,可根据模型类型(比如你场景中的OCSVM模型)提取指定参数(如核函数类型、训练样本数、权重等)后写入txt,更方便运营人员查看。
  • 注意:不要加载来源不明的pkl文件,pickle/joblib的反序列化操作存在执行恶意代码的安全风险。

内容的提问来源于stack exchange,提问作者Lalastro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:54:07