Erreur de pickle Python: UnicodeDecodeError


93

J'essaye de faire une classification de texte en utilisant Textblob. Je commence par entraîner le modèle et je le sérialise à l'aide de pickle comme indiqué ci-dessous.

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

Et quand j'essaye d'exécuter ce fichier:

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

J'obtiens cette erreur:

UnicodeDecodeError: le codec 'utf-8' ne peut pas décoder l'octet 0x80 en position 0: octet de départ invalide

Voici le contenu de mon sample.csv:

Mon SQL ne fonctionne pas du tout correctement. C'était un mauvais choix, SQL

J'ai des problèmes. Veuillez répondre immédiatement, Support

Où vais-je mal ici? Veuillez aider.


Réponses:


152

En choisissant openle fichier en mode wb, vous choisissez d'écrire en binaire brut. Aucun encodage de caractères n'est appliqué.

Ainsi pour lire ce fichier, vous devez simplement openen mode rb.


Y a-t-il une raison à utiliser wblors de la sauvegarde du cornichon? ou y a-t-il un mode que l'on peut utiliser pour enregistrer le cornichon qui ne nécessiterait pas de l'ouvrir avec le rbmode?
tsando

1
@tsando J'utilise wbparce qu'un problème que je n'ai pas encore résolu m'empêche de l'utiliser wavec pickle. Il se plaint d'écrire des octets au lieu de chaînes.
Gigaflop

Merci ... vous avez sauvé ma journée
Kumar KS

27

Je pense que vous devriez ouvrir le fichier comme

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

Vous ne devriez pas avoir à le décoder. pickle.loadvous donnera une copie exacte de tout ce que vous avez enregistré. À ce stade, vous devriez pouvoir travailler avec clcomme si vous venez de le créer.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.