UnicodeDecodeError: Der Codec 'charmap' kann Byte X an Position Y nicht dekodieren: Zeichen werden <undefined> zugeordnet


549

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>`  

2
Für den gleichen Fehler hat mir diese Lösung geholfen, Lösung des Charmap-Fehlers
Shubham Sharma

2
Unter Verarbeiten von Textdateien in Python 3 erfahren Sie, warum dieser Fehler auftritt.
Andreas Haferburg

Antworten:


960

Die betreffende Datei verwendet nicht die CP1252Codierung. Es wird eine andere Codierung verwendet. Welches müssen Sie selbst herausfinden. Gemeinsame sind Latin-1und UTF-8. Da 0x90 nicht wirklich bedeutet nichts in Latin-1, UTF-8(wo 0x90 eine Fortsetzung Byte) wahrscheinlicher.

Sie geben die Codierung an, wenn Sie die Datei öffnen:

file = open(filename, encoding="utf8")

19
Cool, ich hatte dieses Problem mit Python 2.7-Code, den ich in Python 3.4 ausführen wollte. Latin-1 hat bei mir funktioniert!
1vand1ng0

2
Wenn Sie Python 2.7 verwenden und den gleichen Fehler erhalten, versuchen Sie das ioModul:io.open(filename,encoding="utf8")
christopherlovell

9
@ 1vand1ng0: Natürlich funktioniert Latin-1; Es funktioniert für jede Datei, unabhängig von der tatsächlichen Codierung der Datei. Das liegt daran, dass alle 256 möglichen Bytewerte in einer Datei einen Latin-1-Codepunkt haben, dem Sie zugeordnet werden können. Dies bedeutet jedoch nicht, dass Sie lesbare Ergebnisse erhalten! Wenn Sie die Codierung nicht kennen, ist es möglicherweise besser, die Datei im Binärmodus zu öffnen, als Latin-1 anzunehmen.
Martijn Pieters

1
Es ist standardmäßig Unicode, aber Unicode ist keine Codierung. regebro.wordpress.com/2011/03/23/…
Lennart Regebro

1
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 auch from geotext import GeoText. Bitte schlagen Sie eine Lösung vor.
Salah

47

Nur für den Fall hinzuzufügen, file = open(filename, encoding="utf8")funktioniert nicht versuchenfile = open(filename, errors='ignore')


Vielen Dank - ich werde es versuchen. Es gibt einige ungültige Zeichen in Teilen von Dateien, die mir egal sind.
Stephen Nutt

6
Warnung: Dies führt zu Datenverlust, wenn unbekannte Zeichen gefunden werden (was je nach Situation in Ordnung sein kann).
Hans Goldman

34

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 Textverfügt über einen Befehl zum Anzeigen der Codierung, wenn diese festgelegt wurde ...

  1. Gehe zu View-> Show Console(oder Ctrl+ `)

Geben Sie hier die Bildbeschreibung ein

  1. Tippe unten in das Feld view.encoding()und hoffe auf das Beste (ich konnte nichts bekommen, Undefinedaber vielleicht hast du besseres Glück ...)

Geben Sie hier die Bildbeschreibung ein


2
Einige Texteditoren stellen diese Informationen ebenfalls zur Verfügung. Ich weiß, dass Sie mit vim dies über :set fileencoding( von diesem Link )
PaxRomana99

3
Sublime Text, auch - öffnen Sie die Konsole und geben Sie ein view.encoding().
JimmidyJoo

Alternativ können Sie Ihre Datei mit dem Editor öffnen. 'Speichern unter' und Sie sehen ein Dropdown-
Menü

9

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är


Vielen Dank, dass dies für mein Problem der Fall war
Shahin Gh

6

TLDR? Versuchen:file = open(filename, encoding='cp437)

Warum? Wenn man verwendet:

file = open(filename)
text = file.read()

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:

file = open(filename, errors='replace')

Eine andere Problemumgehung besteht darin, Folgendes zu verwenden:

file = open(filename, errors='ignore')

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):

file = open(filename, encoding='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).


1
Wow, danke dir. Dies ist die einzige Dekodierung, die für mich funktioniert.
Kowalski

1

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.


1

Verschwenden Sie keine Zeit mehr, sondern fügen Sie beim Lesen und Schreiben Folgendes encoding="cp437"und errors='ignore'Ihren Code hinzu:

open('filename.csv', encoding="cp437", errors='ignore')
open(file_name, 'w', newline='', encoding="cp437", errors='ignore')

Gute Fahrt


Sicher Sir. Verstanden. Keine Zeitverschwendung. Vielen Dank. Möchten Sie eine Tasse Kaffee oder einen guten Wein?
Pramesh Bajracharya

0

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 Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.