2016-07-29 11 views
0

Ich laufe dies:UnicodeDecodeError beim Laden der Datei in Python

news_train = load_mlcomp('20news-18828', 'train') 
vectorizer = TfidfVectorizer(encoding='latin1') 
X_train = vectorizer.fit_transform((open(f, errors='ignore').read() 
           for f in news_train.filenames)) 

aber es UnicodeDecodeError bekommt: ungültige Fortsetzung Byte: 'utf-8' Codec kann nicht Byte 0xe4 in Position 39 dekodieren. bei open() -Funktion.

Ich überprüfte die news_train.filenames. Es ist:

array(['/Users/juby/Downloads/mlcomp/379/train/sci.med/12836-58920', 
     ..., '/Users/juby/Downloads/mlcomp/379/train/sci.space/14129-61228'], 
     dtype='<U74') 

Pfade sehen korrekt aus. Es könnte über dtype oder meine Umgebung sein (ich bin Mac OSX 10.11), aber ich kann es nicht reparieren, nachdem ich es viele Male versucht habe. Vielen Dank!!!

P. S es ist ein ML-Tutorial von http://scikit-learn.org/stable/auto_examples/text/mlcomp_sparse_document_classification.html#example-text-mlcomp-sparse-document-classification-py

+1

Python 3? Probieren Sie 'open (f, mode = 'rb', errors = 'ignorieren')'. –

+0

Ja, es ist Python3.5. Ich habe es getan, aber ich habe "Binär-Modus nimmt kein Fehler Argument" – Denly

+0

Entfernen Sie einfach die Fehler = "Ignorieren" kann den Trick tun. Oder die Antwort, die du selbst gepostet hast. –

Antwort

0

Nun, ich die Lösung gefunden. Verwenden

open(f, encoding = "latin1") 

Ich bin mir nicht sicher, warum es nur auf meinem Mac obwohl passiert. Ich möchte es wissen.

0

Eigentlich in Python 3+, die open Funktion öffnet und liest Datei im Standardmodus 'r', die den Dateiinhalt (auf den meisten Plattformen, in UTF-8) dekodieren wird. Da Ihre Dateien in latin1 codiert sind, können Sie sie mit UTF-8 decodieren, was dazu führen kann, dass UnicodeDecodeError. Die Lösung besteht darin, die Dateien entweder im Binärmodus ('rb') zu öffnen oder die korrekte Codierung anzugeben (encoding="latin1").

open(f, 'rb').read() # returns `byte` rather than `str` 
# or, 
open(f, encoding='latin1').read() # returns latin1 decoded `str` 
Verwandte Themen