web-dev-qa-db-fra.com

Python: UnicodeDecodeError: le codec 'utf8' ne peut pas décoder octet

Je lis un tas de fichiers RTF dans des chaînes python . Sur certains textes, j'obtiens cette erreur:

Traceback (most recent call last):
  File "11.08.py", line 47, in <module>
    X = vectorizer.fit_transform(texts)
  File "C:\Python27\lib\site-packages\sklearn\feature_extraction\text.py", line
716, in fit_transform
    X = super(TfidfVectorizer, self).fit_transform(raw_documents)
  File "C:\Python27\lib\site-packages\sklearn\feature_extraction\text.py", line
398, in fit_transform
    term_count_current = Counter(analyze(doc))
  File "C:\Python27\lib\site-packages\sklearn\feature_extraction\text.py", line
313, in <lambda>
    tokenize(preprocess(self.decode(doc))), stop_words)
  File "C:\Python27\lib\site-packages\sklearn\feature_extraction\text.py", line
224, in decode
    doc = doc.decode(self.charset, self.charset_error)
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 462: invalid
 start byte

J'ai essayé: 

  1. Copier et coller le texte des fichiers dans de nouveaux fichiers
  2. enregistrer les fichiers rtf en tant que fichiers txt
  3. Ouvrez les fichiers txt dans Notepad ++, choisissez "convertir en utf-8" et réglez l'encodage sur utf-8.
  4. Ouvrir les fichiers avec Microsoft Word et les enregistrer en tant que nouveaux fichiers

Rien ne fonctionne. Des idées?

Ce n'est probablement pas lié, mais voici le code dans lequel vous vous demandez:

f = open(dir+location, "r")
doc = Rtf15Reader.read(f)
t = PlaintextWriter.write(doc).getvalue()
texts.append(t)
f.close()
vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5, stop_words='english')
X = vectorizer.fit_transform(texts)     
13
Zach

comme je l'ai dit dans la liste de diffusion, il est probablement plus simple d'utiliser l'option charset_error et de la définir sur ignore. Si le fichier est réellement utf-16, vous pouvez également définir le jeu de caractères sur utf-16 dans le vectoriseur .Voir la docs .

6
Andreas Mueller

Cela résoudra vos problèmes:

import codecs

f = codecs.open(dir+location, 'r', encoding='utf-8')
txt = f.read()

À partir de ce moment, txt est au format Unicode et vous pouvez l'utiliser partout dans votre code.

Si vous souhaitez générer des fichiers UTF-8 après votre traitement, procédez comme suit:

f.write(txt.encode('utf-8'))
10

Vous pouvez vider les lignes du fichier csv dans le fichier json sans erreur de codage, comme suit:

json.dump(row,jsonfile, encoding="ISO-8859-1")
1
Piyush S. Wanare