So beheben Sie Folgendes: "UnicodeDecodeError: 'ascii'-Codec kann Byte nicht dekodieren"

459
as3:~/ngokevin-site# nano content/blog/20140114_test-chinese.mkd
as3:~/ngokevin-site# wok
Traceback (most recent call last):
File "/usr/local/bin/wok", line 4, in
Engine()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 104, in init
self.load_pages()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 238, in load_pages
p = Page.from_file(os.path.join(root, f), self.options, self, renderer)
File "/usr/local/lib/python2.7/site-packages/wok/page.py", line 111, in from_file
page.meta['content'] = page.renderer.render(page.original)
File "/usr/local/lib/python2.7/site-packages/wok/renderers.py", line 46, in render
return markdown(plain, Markdown.plugins)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 419, in markdown
return md.convert(text)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 281, in convert
source = unicode(source)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 1: ordinal not in range(128). -- Note: Markdown only accepts unicode input!

Wie man es repariert?

In einigen anderen Python-basierten statischen Blog-Apps kann der chinesische Beitrag erfolgreich veröffentlicht werden. Wie diese App: http://github.com/vrypan/bucket3 . Auf meiner Website http://bc3.brite.biz/ kann ein chinesischer Beitrag erfolgreich veröffentlicht werden.

Fischer
quelle

Antworten:

569

tl; dr / schnelle Lösung

  • Nicht ohne weiteres dekodieren / kodieren
  • Gehen Sie nicht davon aus, dass Ihre Zeichenfolgen UTF-8-codiert sind
  • Versuchen Sie, Zeichenfolgen so schnell wie möglich in Ihrem Code in Unicode-Zeichenfolgen zu konvertieren
  • Korrigieren Sie Ihr Gebietsschema: Wie löse ich UnicodeDecodeError in Python 3.6?
  • Seien Sie nicht versucht, schnelle reloadHacks zu verwenden

Unicode Zen in Python 2.x - Die lange Version

Ohne die Quelle zu sehen, ist es schwierig, die Grundursache zu kennen, daher muss ich allgemein sprechen.

UnicodeDecodeError: 'ascii' codec can't decode byteDies geschieht im Allgemeinen, wenn Sie versuchen, eine Python 2.x-Datei str, die kein ASCII enthält, in eine Unicode-Zeichenfolge zu konvertieren, ohne die Codierung der ursprünglichen Zeichenfolge anzugeben.

Kurz gesagt, Unicode-Zeichenfolgen sind ein völlig separater Typ von Python-Zeichenfolgen, der keine Codierung enthält. Sie enthalten nur Unicode- Punktcodes und können daher jeden Unicode-Punkt aus dem gesamten Spektrum enthalten. Zeichenfolgen enthalten codierten Text, zB UTF-8, UTF-16, ISO-8895-1, GBK, Big5 usw. Zeichenfolgen werden in Unicode dekodiert und Unicodes werden in Zeichenfolgen codiert . Dateien und Textdaten werden immer in codierten Zeichenfolgen übertragen.

Die Autoren des Markdown-Moduls verwenden wahrscheinlich unicode()(wo die Ausnahme ausgelöst wird) als Qualitätsgatter für den Rest des Codes - es konvertiert ASCII oder umschließt vorhandene Unicodes-Zeichenfolgen erneut in eine neue Unicode-Zeichenfolge. Die Markdown-Autoren können die Codierung der eingehenden Zeichenfolge nicht kennen. Sie müssen daher Zeichenfolgen in Unicode-Zeichenfolgen dekodieren, bevor Sie sie an Markdown übergeben.

Unicode-Zeichenfolgen können in Ihrem Code mit dem uPräfix für Zeichenfolgen deklariert werden . Z.B

>>> my_u = u'my ünicôdé strįng'
>>> type(my_u)
<type 'unicode'>

Unicode-Zeichenfolgen können auch aus Dateien, Datenbanken und Netzwerkmodulen stammen. In diesem Fall müssen Sie sich keine Gedanken über die Codierung machen.

Fallstricke

Die Konvertierung von strin Unicode kann auch dann erfolgen, wenn Sie nicht explizit aufrufen unicode().

Die folgenden Szenarien verursachen UnicodeDecodeErrorAusnahmen:

# Explicit conversion without encoding
unicode('€')

# New style format string into Unicode string
# Python will try to convert value string to Unicode first
u"The currency is: {}".format('€')

# Old style format string into Unicode string
# Python will try to convert value string to Unicode first
u'The currency is: %s' % '€'

# Append string to Unicode
# Python will try to convert string to Unicode first
u'The currency is: ' + '€'         

Beispiele

In der folgenden Abbildung sehen Sie, wie das Wort caféje nach Terminaltyp entweder in "UTF-8" - oder "Cp1252" -Codierung codiert wurde. In beiden Beispielen cafist nur reguläres ASCII. In UTF-8 éwird mit zwei Bytes codiert. In "Cp1252" ist é 0xE9 (was auch der Unicode-Punktwert ist (es ist kein Zufall)). Das Richtige decode()wird aufgerufen und die Konvertierung in einen Python-Unicode ist erfolgreich: Diagramm einer Zeichenfolge, die in eine Python-Unicode-Zeichenfolge konvertiert wird

In diesem Diagramm decode()wird mit aufgerufen ascii(was dem Aufrufen unicode()ohne angegebene Codierung entspricht). Da ASCII keine Bytes größer als enthalten kann 0x7F, wird eine UnicodeDecodeErrorAusnahme ausgelöst:

Diagramm einer Zeichenfolge, die in eine Python-Unicode-Zeichenfolge mit der falschen Codierung konvertiert wird

Das Unicode-Sandwich

Es wird empfohlen, in Ihrem Code ein Unicode-Sandwich zu erstellen, in dem Sie alle eingehenden Daten in Unicode-Zeichenfolgen dekodieren, mit Unicodes arbeiten und strauf dem Weg nach draußen in s codieren . Dies erspart Ihnen die Sorge um die Codierung von Zeichenfolgen in der Mitte Ihres Codes.

Eingabe / Dekodierung

Quellcode

Wenn Sie Nicht-ASCII in Ihren Quellcode backen müssen, erstellen Sie einfach Unicode-Zeichenfolgen, indem Sie der Zeichenfolge ein Präfix voranstellen u. Z.B

u'Zürich'

Damit Python Ihren Quellcode dekodieren kann, müssen Sie einen Codierungsheader hinzufügen, der der tatsächlichen Codierung Ihrer Datei entspricht. Wenn Ihre Datei beispielsweise als 'UTF-8' codiert wäre, würden Sie Folgendes verwenden:

# encoding: utf-8

Dies ist nur erforderlich, wenn Ihr Quellcode Nicht-ASCII enthält .

Dateien

Normalerweise werden Nicht-ASCII-Daten aus einer Datei empfangen. Das ioModul bietet einen TextWrapper, der Ihre Datei im laufenden Betrieb unter Verwendung eines bestimmten Codes dekodiert encoding. Sie müssen die richtige Codierung für die Datei verwenden - dies kann nicht leicht erraten werden. Zum Beispiel für eine UTF-8-Datei:

import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
     my_unicode_string = my_file.read() 

my_unicode_stringwäre dann für die Weitergabe an Markdown geeignet. Wenn a UnicodeDecodeErroraus der read()Zeile stammt, haben Sie wahrscheinlich den falschen Codierungswert verwendet.

CSV-Dateien

Das Python 2.7 CSV-Modul unterstützt keine Nicht-ASCII-Zeichen 😩. Hilfe erhalten Sie jedoch unter https://pypi.python.org/pypi/backports.csv .

Verwenden Sie es wie oben, aber übergeben Sie die geöffnete Datei daran:

from backports import csv
import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
    for row in csv.reader(my_file):
        yield row

Datenbanken

Die meisten Python-Datenbanktreiber können Daten in Unicode zurückgeben, erfordern jedoch normalerweise eine kleine Konfiguration. Verwenden Sie für SQL-Abfragen immer Unicode-Zeichenfolgen.

MySQL

Fügen Sie in der Verbindungszeichenfolge Folgendes hinzu:

charset='utf8',
use_unicode=True

Z.B

>>> db = MySQLdb.connect(host="localhost", user='root', passwd='passwd', db='sandbox', use_unicode=True, charset="utf8")
PostgreSQL

Hinzufügen:

psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

HTTP

Webseiten können in nahezu jeder Codierung codiert werden. Der Content-typeHeader sollte ein charsetFeld enthalten , das auf die Codierung hinweist. Der Inhalt kann dann manuell gegen diesen Wert dekodiert werden. Alternativ gibt Python-Requests Unicodes in zurück response.text.

Manuell

Wenn Sie Zeichenfolgen manuell dekodieren müssen, können Sie einfach tun my_string.decode(encoding), wo encodingdie entsprechende Codierung ist. Von Python 2.x unterstützte Codecs finden Sie hier: Standardcodierungen . Wenn Sie erhalten, haben UnicodeDecodeErrorSie wahrscheinlich die falsche Codierung.

Das Fleisch des Sandwichs

Arbeiten Sie mit Unicodes wie mit normalen Strs.

Ausgabe

Standardausgabe / Drucken

printschreibt durch den stdout-Stream. Python versucht, einen Encoder auf stdout so zu konfigurieren, dass Unicodes mit der Codierung der Konsole codiert werden. Wenn es sich beispielsweise um eine Linux-Shell localehandelt en_GB.UTF-8, wird die Ausgabe in codiert UTF-8. Unter Windows sind Sie auf eine 8-Bit-Codepage beschränkt.

Eine falsch konfigurierte Konsole, z. B. ein beschädigtes Gebietsschema, kann zu unerwarteten Druckfehlern führen. PYTHONIOENCODINGUmgebungsvariable kann die Codierung für stdout erzwingen.

Dateien

io.openKann genau wie die Eingabe verwendet werden, um Unicodes transparent in codierte Byte-Zeichenfolgen zu konvertieren.

Datenbank

Mit derselben Konfiguration zum Lesen können Unicodes direkt geschrieben werden.

Python 3

Python 3 ist nicht mehr Unicode-fähig als Python 2.x, ist jedoch in Bezug auf das Thema etwas weniger verwirrt. ZB ist der reguläre strjetzt ein Unicode-String und der alte strjetzt bytes.

Die Standardcodierung ist UTF-8. Wenn Sie also .decode()eine Byte-Zeichenfolge ohne Angabe einer Codierung verwenden, verwendet Python 3 die UTF-8-Codierung. Dies behebt wahrscheinlich 50% der Unicode-Probleme.

Arbeitet außerdem open()standardmäßig im Textmodus, gibt also dekodierte str(Unicode- Rückgaben ) zurück. Die Codierung wird von Ihrem Gebietsschema abgeleitet, das auf Un * x-Systemen in der Regel UTF-8 oder auf Windows-Boxen eine 8-Bit-Codepage wie Windows-1251 ist.

Warum sollten Sie nicht verwenden sys.setdefaultencoding('utf8')

Es ist ein böser Hack (es gibt einen Grund, den Sie verwenden müssen reload), der nur Probleme maskiert und Ihre Migration zu Python 3.x behindert. Verstehen Sie das Problem, beheben Sie die Grundursache und genießen Sie Unicode Zen. Siehe Warum sollten wir sys.setdefaultencoding ("utf-8") NICHT in einem py-Skript verwenden? für weitere Details

Alastair McCormack
quelle
2
Für jemanden, der nach Python 2-Antworten sucht, eine nützlichere TLDR: Verwenden Sie diese Option io.openzum Lesen / Schreiben von Dateien, verwenden Sie from __future__ import unicode_literalsandere Dateneingaben / -ausgaben (z. B. Datenbanken), um Unicode zu verwenden.
idbrii
Sooo, wie beheben wir das? lol das ist kein Problem beim Schreiben eines Skripts - es ist von der Installation eines
Matthew
@ Matthew versuchen Einstellung PYTHONIOENCODING=utf-8. Wenn dies das Problem nicht behebt, müssen Sie sich an den Autor des Skripts wenden, um dessen Code zu beheben.
Alastair McCormack
498

Endlich hab ich es:

as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8  
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')

Lass mich das überprüfen:

as3:~/ngokevin-site# python
Python 2.7.6 (default, Dec  6 2013, 14:49:02)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.getdefaultencoding()
'utf8'
>>>

Das Obige zeigt die Standardcodierung von Python utf8. Dann ist der Fehler nicht mehr.

Fischer
quelle
7
Ich versuche dies, aber es konnte die Codierung nicht dauerhaft ändern. Sobald Sie die Python-Konsole verlassen und erneut starten, ist die Codierung immer noch dieselbe
Macemers
37
Vielen Dank! Aber warum müssen wir sys nach dem Import neu laden?
Dmiters
6
@DmitryNarkevich, wegen der Illusive setdefaultencoding Funktion. Es wird beim Start von Python gelöscht, da es anscheinend nie Teil einer ordnungsgemäßen Veröffentlichung gewesen sein sollte.
Predi
3
Dies bedeutet, dass Sie die Grundursache nicht behoben haben. Sie haben gerade eine implizite Konvertierung gepatcht
Alastair McCormack
5
Die Standardcodierung von @miraculixx Python 3 ist UTF-8 mit Unicode-Zeichenfolgen als Standard str, sodass sie dort nicht überfällig ist. In Python 2.x befand sich Unicode im Übergangszustand, daher wäre es gefährlich gewesen, beim Konvertieren von Bytes in Unicodes eine Codierung anzunehmen. Daher war die Standardcodierung von ASCII für Py2 eine bewusste Wahl, und warum das Ändern der Standardcodierung das absichtliche erneute Laden erfordert sys. Der richtige Weg, um Codierungsfehler in Py2 zu verbannen, besteht darin, Zeichenfolgen eindeutig zu dekodieren und in Unicode zu codieren, wenn Konvertierungen erforderlich sind - und nicht nur davon auszugehen, dass Zeichenfolgen UTF-8-codiert sind.
Alastair McCormack
130

Dies ist das klassische "Unicode-Problem". Ich glaube, dass das Erklären dies über den Rahmen einer StackOverflow-Antwort hinausgeht, um vollständig zu erklären, was passiert.

Es ist gut erklärt hier .

In einer sehr kurzen Zusammenfassung haben Sie etwas, das als Zeichenfolge von Bytes interpretiert wird, an etwas übergeben, das es in Unicode-Zeichen dekodieren muss, aber der Standardcodec (ASCII) schlägt fehl.

Die Präsentation, auf die ich Sie hingewiesen habe, gibt Ratschläge, um dies zu vermeiden. Machen Sie Ihren Code zu einem "Unicode-Sandwich". In Python 2 from __future__ import unicode_literalshilft die Verwendung von .

Update: Wie kann der Code repariert werden:

OK - in Ihrer Variablen "Quelle" haben Sie einige Bytes. Aus Ihrer Frage geht nicht hervor, wie sie dort hineingekommen sind - vielleicht haben Sie sie aus einem Webformular gelesen? In jedem Fall sind sie nicht mit ASCII codiert, aber Python versucht, sie in Unicode zu konvertieren, vorausgesetzt, sie sind es. Sie müssen explizit angeben, wie die Codierung lautet. Dies bedeutet, dass Sie wissen müssen , wie die Codierung lautet! Das ist nicht immer einfach und hängt ganz davon ab, woher diese Saite stammt. Sie könnten mit einigen gängigen Codierungen experimentieren - zum Beispiel UTF-8. Sie teilen unicode () die Codierung als zweiten Parameter mit:

source = unicode(source, 'utf-8')
GreenAsJade
quelle
1
Es ist immer noch Kopfschmerzen. Herr GreenAsJade, können Sie mir eine konkrete Lösung geben?
Fischer
1
Fragen Sie "Wie kann ich als Benutzer dieses Blogs dieses Problem vermeiden?". Oder ist Ihre Frage "Wie kann ich den Code reparieren, damit dieses Problem nicht auftritt"?
GreenAsJade
2
mr greenasjade: wo soll ich "source = unicode (source, 'utf-8')" setzen?
Fischer
7
Seltsam ... nach über einem Jahr positivem Feedback, plötzlich zwei negativen Stimmen ... Huh?
GreenAsJade
11
Verwenden Sie currentFile = open(filename, 'rt', encoding='latin1')oder currentFile = open(filename, 'rt', encoding='utf-8')- siehe hier: stackoverflow.com/a/23917799/2047442
irudyak
42

In einigen Fällen wird beim Überprüfen Ihrer Standardcodierung ( print sys.getdefaultencoding()) zurückgegeben, dass Sie ASCII verwenden. Wenn Sie zu UTF-8 wechseln, funktioniert dies je nach Inhalt Ihrer Variablen nicht. Ich habe einen anderen Weg gefunden:

import sys
reload(sys)  
sys.setdefaultencoding('Cp1252')
Davy
quelle
Dies funktionierte für mein Problem mit Python, das UnicodeDecodeError auf var = u
auslöst.
AttributeError: Modul 'sys' hat kein Attribut 'setdefaultencoding'
Chaine
und reload(sys)wird aus diesem besonderen Grund verwendet.
Marcin Orlowski
1
Hat für mich gearbeitet! VIELEN DANK !
Maciej
22

Ich habe nach der folgenden Fehlermeldung gesucht:

Unicodedecodeerror: Der Codec 'ascii' kann das Byte 0xe2 an Position 5454 nicht dekodieren: Ordnungszahl nicht im Bereich (128)

Ich habe es endlich behoben, indem ich 'Kodierung' angegeben habe:

f = open('../glove/glove.6B.100d.txt', encoding="utf-8")

Ich wünschte, es könnte dir auch helfen.

Zoe L.
quelle
Dies löste den Fehler für mich beim Lesen / Schreiben von CSV-Dateien, brauchte keine der anderen Sachen in den anderen Antworten aufgeführt
user5359531
Ich verstehe nicht, warum die anderen Antworten so viele Details enthalten ... aber vergessen Sie diese einfache Lösung. +10!
stan0
18
"UnicodeDecodeError: 'ascii' codec can't decode byte"

Ursache für diesen Fehler: input_string muss Unicode sein, aber str wurde angegeben

"TypeError: Decoding Unicode is not supported"

Ursache für diesen Fehler: Versuch, Unicode input_string in Unicode zu konvertieren


Überprüfen Sie also zuerst, ob Ihr input_string ist, strund konvertieren Sie ihn gegebenenfalls in Unicode:

if isinstance(input_string, str):
   input_string = unicode(input_string, 'utf-8')

Zweitens ändert das Obige nur den Typ, entfernt jedoch keine Nicht-ASCII-Zeichen. Wenn Sie Nicht-ASCII-Zeichen entfernen möchten:

if isinstance(input_string, str):
   input_string = input_string.decode('ascii', 'ignore').encode('ascii') #note: this removes the character and encodes back to string.

elif isinstance(input_string, unicode):
   input_string = input_string.encode('ascii', 'ignore')
Aishwarya Subramanian
quelle
9

Ich finde, das Beste ist, immer in Unicode zu konvertieren - aber das ist schwierig zu erreichen, da Sie in der Praxis jedes Argument überprüfen und in jede Funktion und Methode konvertieren müssen, die Sie jemals geschrieben haben und die eine Form der Zeichenfolgenverarbeitung enthält.

Daher habe ich den folgenden Ansatz entwickelt, um entweder Unicodes oder Byte-Strings von beiden Eingaben zu garantieren. Kurz gesagt, schließen Sie die folgenden Lambdas ein und verwenden Sie sie :

# guarantee unicode string
_u = lambda t: t.decode('UTF-8', 'replace') if isinstance(t, str) else t
_uu = lambda *tt: tuple(_u(t) for t in tt) 
# guarantee byte string in UTF8 encoding
_u8 = lambda t: t.encode('UTF-8', 'replace') if isinstance(t, unicode) else t
_uu8 = lambda *tt: tuple(_u8(t) for t in tt)

Beispiele:

text='Some string with codes > 127, like Zürich'
utext=u'Some string with codes > 127, like Zürich'
print "==> with _u, _uu"
print _u(text), type(_u(text))
print _u(utext), type(_u(utext))
print _uu(text, utext), type(_uu(text, utext))
print "==> with u8, uu8"
print _u8(text), type(_u8(text))
print _u8(utext), type(_u8(utext))
print _uu8(text, utext), type(_uu8(text, utext))
# with % formatting, always use _u() and _uu()
print "Some unknown input %s" % _u(text)
print "Multiple inputs %s, %s" % _uu(text, text)
# but with string.format be sure to always work with unicode strings
print u"Also works with formats: {}".format(_u(text))
print u"Also works with formats: {},{}".format(*_uu(text, text))
# ... or use _u8 and _uu8, because string.format expects byte strings
print "Also works with formats: {}".format(_u8(text))
print "Also works with formats: {},{}".format(*_uu8(text, text))

Hier sind einige weitere Gründe dafür .

Miraculixx
quelle
Hallo, in Python 3 funktioniert die Funktion _u nicht mit diesem Wert 'Ita £'.
Martin
1
Ok, wo soll ich mit deiner "Argumentation" anfangen? print unicode(u'Zürich', encoding="UTF-8")und dann beschweren Sie sich "Aber erstaunlicherweise können Sie Unicode ext nicht in UTF8 codieren". unicode()codiert nicht; es dekodiert und Sie können keinen Unicode dekodieren - es ist bereits dekodiert!
Alastair McCormack
@AlastairMcCormack Gerne können Sie den Beitrag verbessern. Wenn Sie es jedoch vorziehen, Ihre angebliche Überlegenheit über alle anderen zu streuen, die Ihre Meinung und Einsicht nicht teilen, bin ich ehrlich gesagt nicht interessiert. Vielen Dank.
Miraculixx
3
@miraculixx Es tut mir leid, ich wollte nicht wie ein Idiot rüberkommen. Es ist einfach unnötig, sich jedes Mal Gedanken über das Dekodieren und Kodieren zu machen, wenn Sie einen String in Ihrem Code verwenden.
Alastair McCormack
7

Überprüfen Sie Folgendes, um dies auf Betriebssystemebene in einer Ubuntu-Installation zu beheben:

$ locale charmap

Wenn du bekommst

locale: Cannot set LC_CTYPE to default locale: No such file or directory

anstatt

UTF-8

dann setzen LC_CTYPEund LC_ALLso:

$ export LC_ALL="en_US.UTF-8"
$ export LC_CTYPE="en_US.UTF-8"
Vervas
quelle
6

Encode konvertiert ein Unicode-Objekt in ein String-Objekt. Ich denke, Sie versuchen, ein String-Objekt zu codieren. Konvertieren Sie zuerst Ihr Ergebnis in ein Unicode-Objekt und codieren Sie dieses Unicode-Objekt dann in 'utf-8'. zum Beispiel

    result = yourFunction()
    result.decode().encode('utf-8')
RAFI AFRIDI
quelle
4

Ich hatte das gleiche Problem, aber es funktionierte nicht für Python 3. Ich folgte diesem und es löste mein Problem:

enc = sys.getdefaultencoding()
file = open(menu, "r", encoding = enc)

Sie müssen die Codierung festlegen, wenn Sie die Datei lesen / schreiben.

Reihan_amn
quelle
4

Habe den gleichen Fehler und dies hat meinen Fehler behoben. Vielen Dank! Python 2 und Python 3, die sich in der Unicode-Behandlung unterscheiden, machen eingelegte Dateien zum Laden ziemlich inkompatibel. Verwenden Sie also das Codierungsargument von Python Pickle. Der folgende Link hat mir geholfen, das ähnliche Problem zu lösen, als ich versuchte, eingelegte Daten aus meinem Python 3.7 zu öffnen, während meine Datei ursprünglich in der Python 2.x-Version gespeichert wurde. https://blog.modest-destiny.com/posts/python-2-and-3-compatible-pickle-save-and-load/ Ich kopiere die Funktion load_pickle in mein Skript und rufe beim Laden von load_pickle (pickle_file) auf Eingabedaten wie folgt:

input_data = load_pickle("my_dataset.pkl")

Die Funktion load_pickle ist hier:

def load_pickle(pickle_file):
    try:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f)
    except UnicodeDecodeError as e:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f, encoding='latin1')
    except Exception as e:
        print('Unable to load data ', pickle_file, ':', e)
        raise
    return pickle_data
Ganesh Shah
quelle
1
Es ist besser, die Definition der load_pickleFunktion in Ihre Antwort aufzunehmen.
Sanyash
4

Das hat bei mir funktioniert:

    file = open('docs/my_messy_doc.pdf', 'rb')
saran3h
quelle
3

Kurz gesagt, um eine ordnungsgemäße Unicode-Behandlung in Python 2 sicherzustellen:

  • Verwendung io.openzum Lesen / Schreiben von Dateien
  • verwenden from __future__ import unicode_literals
  • Konfigurieren Sie andere Dateneingänge / -ausgänge (z. B. Datenbanken, Netzwerk) für die Verwendung von Unicode
  • Wenn Sie keine Ausgaben für utf-8 konfigurieren können, konvertieren Sie Ihre Ausgaben für diese print(text.encode('ascii', 'replace').decode())

Erläuterungen finden Sie in der ausführlichen Antwort von @Alastair McCormack .

idbrii
quelle
• Verwenden io.open(path, 'r', encoding='utf-8')Sie diese Option, um utf-8-codierte Dateien zu lesen.
Bob Stein
3

Ich hatte den gleichen Fehler mit URLs, die Nicht-ASCII-Zeichen (Bytes mit Werten> 128) enthielten. Meine Lösung:

url = url.decode('utf8').encode('utf-8')

Hinweis: utf-8, utf8 sind einfach Aliase. Die Verwendung von nur 'utf8' oder 'utf-8' sollte auf die gleiche Weise funktionieren

In meinem Fall, der für mich in Python 2.7 funktioniert hat, hat diese Zuweisung vermutlich 'etwas' in der strinternen Darstellung geändert - dh sie erzwingt die richtige Dekodierung der gesicherten Bytesequenz in urlund setzt den String schließlich in ein utf-8 str mit all die Magie am richtigen Ort. Unicode in Python ist für mich schwarze Magie. Hoffe nützlich

Fabiano Tarlao
quelle
1
Warum ein Schlag in den einen und nicht in den anderen
IgorGanapolsky
1
Python akzeptiert Aliase zum Codieren von Namen, ich habe es jetzt versucht und das gleiche ausgeführt ... einfach habe ich nicht bemerkt, dass ich sie anders geschrieben habe, fügte hinzu
Fabiano Tarlao
2

Ich habe das gleiche Problem mit der Saite "PastelerÃa Mallorca" und habe gelöst mit:

unicode("Pastelería Mallorca", 'latin-1')
Alle Pavesi
quelle
1

In einem Django (1.9.10) / Python 2.7.5-Projekt habe ich häufige UnicodeDecodeErrorAusnahmen; hauptsächlich, wenn ich versuche, Unicode-Zeichenfolgen in die Protokollierung einzugeben. Ich habe eine Hilfsfunktion für beliebige Objekte erstellt, um sie im Grunde genommen auf 8-Bit-ASCII-Zeichenfolgen zu formatieren und alle Zeichen, die nicht in der Tabelle enthalten sind, durch '?' Zu ersetzen. Ich denke, es ist nicht die beste Lösung, aber da die Standardcodierung ASCII ist (und ich sie nicht ändern möchte), reicht es aus:

def encode_for_logging (c, encoding = 'ascii'):
    wenn isinstance (c, basestring):
        return c.encode (Kodierung, 'ersetzen')
    elif isinstance (c, Iterable):
        c_ = []
        für v in c:
            c_.append (encode_for_logging (v, encoding))
        return c_
    sonst:
        return encode_for_logging (Unicode (c))
`

Paul Bormans
quelle
1

Dieser Fehler tritt auf, wenn unsere Zeichenfolge einige Nicht-ASCII-Zeichen enthält und wir Operationen an dieser Zeichenfolge ohne ordnungsgemäße Dekodierung ausführen. Dies hat mir geholfen, mein Problem zu lösen. Ich lese eine CSV-Datei mit Spalten-ID, Text und Dekodierungszeichen wie folgt:

train_df = pd.read_csv("Example.csv")
train_data = train_df.values
for i in train_data:
    print("ID :" + i[0])
    text = i[1].decode("utf-8",errors="ignore").strip().lower()
    print("Text: " + text)
Sravya
quelle
0

Hier ist meine Lösung, fügen Sie einfach die Codierung hinzu. with open(file, encoding='utf8') as f

Und da das Lesen der Handschuhdatei lange dauern wird, empfehle ich, die Handschuhdatei in eine Numpy-Datei umzuwandeln. Wenn Sie die Einbettungsgewichte netx time lesen, sparen Sie Zeit.

import numpy as np
from tqdm import tqdm


def load_glove(file):
    """Loads GloVe vectors in numpy array.
    Args:
        file (str): a path to a glove file.
    Return:
        dict: a dict of numpy arrays.
    """
    embeddings_index = {}
    with open(file, encoding='utf8') as f:
        for i, line in tqdm(enumerate(f)):
            values = line.split()
            word = ''.join(values[:-300])
            coefs = np.asarray(values[-300:], dtype='float32')
            embeddings_index[word] = coefs

    return embeddings_index

# EMBEDDING_PATH = '../embedding_weights/glove.840B.300d.txt'
EMBEDDING_PATH = 'glove.840B.300d.txt'
embeddings = load_glove(EMBEDDING_PATH)

np.save('glove_embeddings.npy', embeddings) 

Hauptlink: https://gist.github.com/BrambleXu/634a844cdd3cd04bb2e3ba3c83aef227

Brombeere
quelle
0

Geben Sie Folgendes an: # encoding = utf-8 oben in Ihrer Python-Datei. Das Problem sollte behoben sein

Sameer Kumar Choudhary
quelle