Erro de pickle do Python: UnicodeDecodeError

95

Estou tentando fazer uma classificação de texto usando Textblob. Primeiro, estou treinando o modelo e serializando-o usando pickle, conforme mostrado abaixo.

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()

E quando tento executar este arquivo:

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

Eu recebo este erro:

UnicodeDecodeError: o codec 'utf-8' não pode decodificar o byte 0x80 na posição 0: byte inicial inválido

A seguir está o conteúdo do meu sample.csv:

Meu SQL não está funcionando corretamente. Esta foi uma escolha errada, SQL

Eu tenho problemas. Por favor responda imediatamente, Suporte

Onde estou errando aqui? Por favor ajude.

90abyss
fonte

Respostas:

157

Ao escolher openo arquivo no modo wb, você está optando por escrever em binário bruto. Não há codificação de caracteres sendo aplicada.

Portanto, para ler este arquivo, você deve simplesmente entrar openno modo rb.

donkopotamus
fonte
Existe uma razão para usar wbao salvar o pickle? ou existe um modo que pode ser usado para salvar o pickle que não exigiria abri-lo com o rbmodo?
tsando
1
@tsando eu uso wbporque um problema que ainda não resolvi me impede de usar wcom pickles. Ele reclama sobre a gravação de bytes em vez de strings.
Gigaflop
Obrigado ... você salvou meu dia
Kumar KS
27

Eu acho que você deve abrir o arquivo como

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

Você não deveria ter que decodificá-lo. pickle.loadlhe dará uma cópia exata de tudo o que você salvou. Neste ponto, você deve ser capaz de trabalhar clcomo se tivesse acabado de criá-lo.

saulspatz
fonte