Ich versuche, ein Python 3-Programm dazu zu bringen, einige Manipulationen mit einer mit Informationen gefüllten Textdatei durchzuführen. Beim Versuch, die Datei zu lesen, wird jedoch die folgende Fehlermeldung angezeigt:
Traceback (most recent call last):
File "SCRIPT LOCATION", line NUMBER, in <module>
`text = file.read()`
File "C:\Python31\lib\encodings\cp1252.py", line 23, in decode
`return codecs.charmap_decode(input,self.errors,decoding_table)[0]`
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 2907500: character maps to `<undefined>`
Antworten:
Die betreffende Datei verwendet nicht die
CP1252
Codierung. Es wird eine andere Codierung verwendet. Welches müssen Sie selbst herausfinden. Gemeinsame sindLatin-1
undUTF-8
. Da 0x90 nicht wirklich bedeutet nichts inLatin-1
,UTF-8
(wo 0x90 eine Fortsetzung Byte) wahrscheinlicher.Sie geben die Codierung an, wenn Sie die Datei öffnen:
quelle
io
Modul:io.open(filename,encoding="utf8")
filename = "C:\Report.txt" with open(filename,encoding ="utf8") as my_file: text = my_file.read() print(text)
Selbst nachdem ich dies benutzt habe, erhalte ich den gleichen Fehler. Ich habe es auch mit anderer Codierung versucht, aber alles umsonst. In diesem Code verwende ich auchfrom geotext import GeoText
. Bitte schlagen Sie eine Lösung vor.Nur für den Fall hinzuzufügen,
file = open(filename, encoding="utf8")
funktioniert nicht versuchenfile = open(filename, errors='ignore')
quelle
Als Erweiterung der Antwort von @ LennartRegebro :
Wenn Sie nicht sagen können, welche Codierung Ihre Datei verwendet, und die obige Lösung nicht funktioniert (nicht
utf8
) und Sie nur raten, gibt es Online-Tools , mit denen Sie die Codierung identifizieren können. Sie sind nicht perfekt, funktionieren aber normalerweise einwandfrei. Nachdem Sie die Codierung herausgefunden haben, sollten Sie in der Lage sein, die oben genannte Lösung zu verwenden.EDIT: (Aus dem Kommentar kopiert)
Ein sehr beliebter Texteditor
Sublime Text
verfügt über einen Befehl zum Anzeigen der Codierung, wenn diese festgelegt wurde ...View
->Show Console
(oder Ctrl+ `)view.encoding()
und hoffe auf das Beste (ich konnte nichts bekommen,Undefined
aber vielleicht hast du besseres Glück ...)quelle
:set fileencoding
( von diesem Link )view.encoding()
.Alternativ, wenn Sie die Datei nicht dekodieren müssen, z. B. das Hochladen der Datei auf eine Website
open(filename, 'rb')
. r = Lesen, b = Binärquelle
TLDR? Versuchen:
file = open(filename, encoding='cp437)
Warum? Wenn man verwendet:
Python geht davon aus, dass die Datei dieselbe Codepage wie die aktuelle Umgebung verwendet (cp1252 im Fall des Eröffnungsbeitrags) und versucht, sie in ihre eigene Standard-UTF-8 zu dekodieren. Wenn die Datei Zeichen von Werten enthält, die in dieser Codepage nicht definiert sind (wie 0x90), erhalten wir UnicodeDecodeError. Manchmal kennen wir die Codierung der Datei nicht, manchmal wird die Codierung der Datei möglicherweise von Python nicht behandelt (wie z. B. cp790), manchmal kann die Datei gemischte Codierungen enthalten.
Wenn solche Zeichen nicht benötigt werden, kann man sie durch Fragezeichen ersetzen durch:
Eine andere Problemumgehung besteht darin, Folgendes zu verwenden:
Die Zeichen bleiben dann intakt, aber auch andere Fehler werden maskiert.
Eine gute Lösung besteht darin, die Codierung anzugeben, jedoch keine Codierung (wie cp1252), sondern die, für die ALLE Zeichen definiert sind (wie cp437):
Codepage 437 ist die ursprüngliche DOS-Codierung. Alle Codes sind definiert, so dass beim Lesen der Datei keine Fehler auftreten, keine Fehler ausgeblendet werden und die Zeichen erhalten bleiben (nicht ganz intakt, aber dennoch unterscheidbar).
quelle
Für diejenigen, die in Anaconda unter Windows arbeiten, hatte ich das gleiche Problem. Notepad ++ hilft mir, es zu lösen.
Öffnen Sie die Datei in Notepad ++. Unten rechts wird die aktuelle Dateicodierung angezeigt. Suchen Sie im oberen Menü neben "Ansicht" nach "Codierung". Gehen Sie in "Codierung" zu "Zeichensätze" und suchen Sie dort mit geduldig nach der gewünschten Umgebung. In meinem Fall wurde die Codierung "Windows-1252" unter "Westeuropäisch" gefunden.
quelle
Verschwenden Sie keine Zeit mehr, sondern fügen Sie beim Lesen und Schreiben Folgendes
encoding="cp437"
underrors='ignore'
Ihren Code hinzu:Gute Fahrt
quelle
Für mich hat das Ändern der MySQL-Zeichencodierung, die mit meinem Code übereinstimmt, dazu beigetragen, die Lösung zu finden. `photo = open ('pic3.png', encoding = latin1), starker Text
quelle