Błąd pikle w Pythonie: UnicodeDecodeError

93

Próbuję dokonać klasyfikacji tekstu za pomocą Textblob. Najpierw uczę model i serializuję go przy użyciu pikle, jak pokazano poniżej.

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

A kiedy spróbuję uruchomić ten plik:

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

Otrzymuję ten błąd:

UnicodeDecodeError: kodek „utf-8” nie może zdekodować bajtu 0x80 na pozycji 0: nieprawidłowy bajt początkowy

Poniżej znajduje się zawartość mojego sample.csv:

Mój SQL w ogóle nie działa poprawnie. To był zły wybór, SQL

Mam problemy. Prosimy o natychmiastową odpowiedź, wsparcie

Gdzie ja tu się mylę? Proszę pomóż.

90abyss
źródło

Odpowiedzi:

152

Wybierając openplik w trybie wb, wybierasz zapis w formacie binarnym surowym. Nie zastosowano kodowania znaków.

Dlatego, aby przeczytać ten plik, powinieneś po prostu openw trybie rb.

donkopotamus
źródło
Czy jest powód, dla którego warto używać wbpodczas oszczędzania marynaty? czy jest jakiś tryb, w którym można uratować marynatę, który nie wymagałby otwierania jej w rbtrybie?
tsando
1
@tsando używam, wbponieważ jakiś problem, którego jeszcze nie naprawiłem, uniemożliwia mi korzystanie wz marynaty. Narzeka na pisanie bajtów zamiast łańcuchów.
Gigaflop,
Dzięki ... uratowałeś mi dzień
Kumar KS
27

Myślę, że powinieneś otworzyć plik jako

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

Nie powinieneś go dekodować. pickle.loadprzekaże ci dokładną kopię tego, co zapisałeś. W tym momencie powinieneś być w stanie pracować cltak, jakbyś właśnie go utworzył.

saulspatz
źródło