it-swarm.com.de

UnicodeDecodeError: Codec 'ascii' kann das Byte 0xe2 in Position 13 nicht decodieren: Ordinalzahl nicht im Bereich (128)

Ich verwende NLTK zum Ausführen von kmeans-Clustering für meine Textdatei, in der jede Zeile als Dokument betrachtet wird. So ist meine Textdatei zum Beispiel so:

finger Todstempel gehören 
hastig 
Mike hastige Wände Jericho 
Jägermeister-Regeln 
Rules Bands folgen der Jägermeister-Bühne 
Ansatz 

Der Demo-Code, den ich ausführen möchte, lautet nun: https://Gist.github.com/xim/1279283

Der Fehler, den ich erhalte, ist folgender:

Traceback (most recent call last):
File "cluster_example.py", line 40, in
words = get_words(job_titles)
File "cluster_example.py", line 20, in get_words
words.add(normalize_Word(word))
File "", line 1, in
File "/usr/local/lib/python2.7/dist-packages/nltk/decorators.py", line 183, in memoize
result = func(*args)
File "cluster_example.py", line 14, in normalize_Word
return stemmer_func(Word.lower())
File "/usr/local/lib/python2.7/dist-packages/nltk/stem/Snowball.py", line 694, in stem
Word = (Word.replace(u"\u2019", u"\x27")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 13: ordinal not in range(128)

Was passiert hier?

98
user2602812

Die Datei wird als Bündel von strs gelesen, sollte jedoch unicodes sein. Python versucht implizit zu konvertieren, schlägt jedoch fehl. Veränderung:

job_titles = [line.strip() for line in title_file.readlines()]

um die strs explizit zu unicode zu decodieren (hier wird UTF-8 angenommen):

job_titles = [line.decode('utf-8').strip() for line in title_file.readlines()]

Es könnte auch durch Importieren von des Moduls codecs und Verwendung von codecs.open anstelle des eingebauten open gelöst werden.

110
icktoofay

Das funktioniert gut für mich.

f = open(file_path, 'r+', encoding="utf-8")

Sie können einen dritten Parameter coding hinzufügen, um sicherzustellen, dass der Codierungstyp 'utf-8' ist.

Hinweis: Diese Methode funktioniert gut in Python3, ich habe es nicht in Python2.7 versucht.

28
uestcfei

Sie können dies auch versuchen:

import sys
reload(sys)
sys.setdefaultencoding('utf8')
26
Siva S

Bei mir gab es ein Problem mit der Terminal-Kodierung. Durch das Hinzufügen von UTF-8 zu .bashrc wurde das Problem gelöst:

export LC_CTYPE=en_US.UTF-8

Vergessen Sie nicht, .bashrc nachzuladen:

source ~/.bashrc
18

ANY- und ALL-Unicode-Fehler finden ... mit folgendem Befehl:

grep -r -P '[^\x00-\x7f]' /etc/Apache2 /etc/letsencrypt /etc/nginx

Habe meine gefunden

/etc/letsencrypt/options-ssl-nginx.conf:        # The following CSP directives don't use default-src as 

Mit shed fand ich die fehlerhafte Reihenfolge. Es stellte sich heraus, dass es ein Fehler des Editors war . 00008099: C2 194 302 11000010 00008100: A0 160 240 10100000 00008101: d 64 100 144 01100100 00008102: e 65 101 145 01100101 00008103: f 66 102 146 01100110 00008104: a 61 097 141 01100001 00008105: u 75 117 165 01110101 00008106: l 6C 108 154 01101100 00008107: t 74 116 164 01110100 00008108: - 2D 045 055 00101101 00008109: s 73 115 163 01110011 00008110: r 72 114 162 01110010 00008111: c 63 099 143 01100011 00008112: C2 194 302 11000010 00008113: A0 160 240 10100000

2
Egbert S

Sie können dies ausprobieren, bevor Sie job_titles string verwenden:

source = unicode(job_titles, 'utf-8')
1
Aminah Nuraini

Unter Ubuntu 18.04 mit Python3.6 habe ich das Problem gelöst, indem ich beides getan habe:

with open(filename, encoding="utf-8") as lines:

und wenn Sie das Tool als Kommandozeile ausführen:

export LC_ALL=C.UTF-8

Beachten Sie, dass Sie, wenn Sie sich in Python2.7 befinden, dies anders handhaben müssen. Zuerst müssen Sie die Standardkodierung festlegen:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

und um die Datei zu laden, müssen Sie io.open verwenden, um die Kodierung festzulegen:

import io
with io.open(filename, 'r', encoding='utf-8') as lines:

Sie müssen die Umgebung noch exportieren

export LC_ALL=C.UTF-8
1
loretoparisi

python3x oder höher

  1. datei in Bytestrom laden:

    body = '' für offene Zeilen ('website/index.html', 'rb'): decodedLine = lines.decode ('utf-8') body = body + decodedLine.strip () Rückgabe body

  2. globale Einstellung verwenden:

    import io import sys sys.stdout = io.TextIOWrapper (sys.stdout.buffer, encoding = 'utf-8')

0
io big

Für Python 3 lautet die Standardcodierung "utf-8". Folgende Schritte werden in der Basisdokumentation vorgeschlagen: https://docs.python.org/2/library/csv.html#csv-examples bei Problemen 

  1. Erstellen Sie eine Funktion

    def utf_8_encoder(unicode_csv_data):
        for line in unicode_csv_data:
            yield line.encode('utf-8')
    
  2. Verwenden Sie dann die Funktion im Leser, z.

    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data))
    
0
iamigham

Tun Sie einfach Folgendes -------------------------

mache open(fn, 'rb').read().decode('utf-8') anstatt nur open(fn).read()

0
Ganesh Kharad