Python泡菜错误:UnicodeDecodeError

Posted

技术标签:

【中文标题】Python泡菜错误:UnicodeDecodeError【英文标题】:Python pickle error: UnicodeDecodeError 【发布时间】:2016-01-02 15:31:59 【问题描述】:

我正在尝试使用 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' 编解码器无法解码位置 0x80 字节 0:无效的起始字节

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

我的 SQL 根本无法正常工作。这是一个错误的选择,SQL

我有问题。请立即回复,支持

我哪里错了?请帮忙。

【问题讨论】:

Using pickle.dump - TypeError: must be str, not bytes的可能重复 【参考方案1】:

通过在wb 模式下选择open 文件,您选择使用原始二进制文件进行写入。没有应用字符编码。

因此要读取此文件,您只需在模式rbopen

【讨论】:

保存泡菜时是否有理由使用wb?或者有没有一种可以用来保存泡菜的模式,不需要用rb 模式打开它? @tsando 我使用wb,因为我还没有解决的一些问题阻止我将w 与泡菜一起使用。它抱怨写字节而不是字符串。【参考方案2】:

我认为你应该打开文件

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

您不必对其进行解码。 pickle.load 将为您提供您保存的任何内容的精确副本。此时,您应该能够使用cl,就像您刚刚创建它一样。

【讨论】:

【参考方案3】:

也许该文件是使用 latin1 编码的:

f = open('sample_classifier.pickle', encoding="latin1")

【讨论】:

【参考方案4】:

因为建议的答案都没有帮助我解决错误 - 我已经改用 joblib:

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

效果很好!

【讨论】:

【参考方案5】:

试试这个代码它的工作原理:

 with open('your picle file name', 'rb') as f:
      classifier = pickle.load(f, encoding="latin1")
注意:如果不固定,如果你使用python2,你可以尝试将(编码)类型更改为(“utf-8”),但如果你使用python3.x,编码将是默认的(“utf-8”)... .

【讨论】:

这个问题的公认答案已经表明并解释了 'rb' fs 选项的使用。设置编码可能对处理遗留系统的人很有用,但值得注意的是,py2 不仅已被弃用,而且在回答时已停用约 18 个月。

以上是关于Python泡菜错误:UnicodeDecodeError的主要内容,如果未能解决你的问题,请参考以下文章

泡菜错误断言id(obj)不在self.memo中

泡菜模块出错。 AttributeError:类没有属性“__new__”

python的泡菜

如何减少在 python 中加载泡菜文件或将泡菜文件映射到磁盘的时间

python luigi localTarget 泡菜

python Python - 泡菜