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

