Python pickle错误:UnicodeDecodeError

134

我正在使用Textblob进行一些文本分类。首先,我将训练模型并使用pickle进行序列化,如下所示。

import pickle
from textblob.classifiers import NaiveBayesClassifier

with open('sample.csv', 'r') as fp:
     cl = NaiveBayesClassifier(fp, format="csv")

f = open('sample_classifier.pickle', 'wb')
pickle.dump(cl, f)
f.close()

当我尝试运行这个文件时:

import pickle
f = open('sample_classifier.pickle', encoding="utf8")
cl = pickle.load(f)    
f.close()

我遇到了这个错误:

UnicodeDecodeError: 'utf-8' 编码无法解码位置为 0 的字节 0x80:无效的起始字节

以下是我的 sample.csv 文件内容:

我的 SQL 完全不能正常工作。这是一个错误的选择,SQL。

我有问题,请立即回应,支持部门。

我做错了什么?请帮我。


可能是重复的问题:使用pickle.dump - TypeError: must be str, not bytes - user3064538
5个回答

234

选择以wb模式打开文件,您选择写入原始二进制数据,没有应用字符编码。

因此,要读取此文件,只需使用rb模式打开即可。


在保存 pickle 时使用 wb 的原因是什么?还是有一种模式可以用来保存 pickle,而不需要使用 rb 模式打开它吗? - tsando
1
@tsando 我使用 wb 是因为我还没有解决某些问题,这些问题阻止了我使用 pickle 的 w。 它抱怨要写入字节而不是字符串。 - Gigaflop
尽管我尝试了这个解决方案,但仍然存在错误。 - Dammio

44

我认为你应该以以下方式打开文件

f = open('sample_classifier.pickle', 'rb')
cl = pickle.load(f)   

你不需要进行解码。 pickle.load 会给你一个与你保存的内容完全相同的副本。这时,你应该可以像刚创建它一样使用 cl


1
也许文件使用 Latin1 编码进行编码:
f = open('sample_classifier.pickle', encoding="latin1")

0

由于没有任何建议的答案能够帮助我解决这个错误,我已经转而使用joblib:

import joblib
clf_loaded = joblib.load('classifier_file_name.joblib')

非常棒的工作!


-3

试试这段代码,它是有效的:

 with open('your picle file name', 'rb') as f:
      classifier = pickle.load(f, encoding="latin1")
  • 注意:如果问题未解决,您可以尝试将编码类型更改为("utf-8"),如果您使用的是Python2,但如果您使用的是Python3.x,则编码将默认为("utf-8")....

这个问题的被接受答案已经指出并解释了使用'rb' fs选项的用途。设置编码可能对处理遗留系统的人有用,但值得注意的是,在回答时,py2已经不仅被弃用,而且已经停止维护约18个月了。 - spkrtn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接