UnicodeDecodeError: ‘charmap’ codec kan byte X niet decoderen op positie Y: karakter wordt toegewezen aan <undefined>

Ik probeer een Python 3-programma enkele manipulaties te laten doen met een tekstbestand vol met informatie. Echter, wanneer ik het bestand probeer te lezen krijg ik de volgende foutmelding:

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

Antwoord 1, autoriteit 100%

Het bestand in kwestie gebruikt niet de CP1252-codering. Het gebruikt een andere codering. Welke moet je zelf uitzoeken. Veelvoorkomende zijn Latin-1en UTF-8. Aangezien 0x90eigenlijk niets betekent in Latin-1, UTF-8(waarbij 0x90een voortzetting is byte) is waarschijnlijker.

U specificeert de codering wanneer u het bestand opent:

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

Antwoord 2, autoriteit 6%

Als file = open(filename, encoding="utf-8")niet werkt, probeer dan
file = open(filename, errors="ignore"), als u onnodige tekens wilt verwijderen. (docs)


Antwoord 3, autoriteit 3%

Als aanvulling op @LennartRegebro’s antwoord:

Als u niet kunt zien wat u niet voor het coderen van uw bestand gebruikt en de bovenstaande oplossing niet werkt (het is niet utf8) en u vond uzelf alleen maar – er zijn Online tools die u kunt gebruiken om te identificeren welke codering dat is. Ze zijn niet perfect, maar werken meestal prima. Nadat u de codering hebt achterhalen, zou u bovenstaande oplossing moeten kunnen gebruiken.

bewerken: (gekopieerd van commentaar)

Een vrij populaire teksteditor Sublime Textheeft een opdracht om codering te tonen als deze is ingesteld …

  1. Ga naar View– & GT; Show Console(of CTRL + `)

  1. Typ in het veld onderaan view.encoding()en hoop op het beste (ik kon niets behalve Undefinedmaar misschien heb je beter geluk. ..)


Antwoord 4, Autoriteit 2%

U kunt ook niet decoderen om het bestand te decoderen, zoals het uploaden van het bestand naar een website, open(filename, 'rb')

waar r = lezen , b = binair


Antwoord 5, Autoriteit 2%

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

Waarom?
Wanneer een gebruik:

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

Python gaat ervan uit dat het bestand dezelfde codepagina gebruikt als de huidige omgeving (cp1252 in het geval van de openingspost) en probeert het te decoderen naar zijn eigen standaard UTF-8. Als het bestand tekens bevat van waarden die niet in deze codepagina zijn gedefinieerd (zoals 0x90), krijgen we UnicodeDecodeError. Soms weten we de codering van het bestand niet, soms kan de codering van het bestand niet worden verwerkt door Python (zoals bijv. cp790), soms kan het bestand gemengde coderingen bevatten.

Als dergelijke tekens niet nodig zijn, kan men besluiten ze te vervangen door vraagtekens, met:

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

Een andere oplossing is om te gebruiken:

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

De tekens blijven dan intact, maar andere fouten worden ook gemaskeerd.

Heel goede oplossingis om de codering op te geven, maar geen codering (zoals cp1252), maar degene die ALLE tekens heeft gedefinieerd (zoals cp437):

file = open(filename, encoding='cp437')

Codepagina 437 is de originele DOS-codering. Alle codes zijn gedefinieerd, dus er zijn geen fouten tijdens het lezen van het bestand, er worden geen fouten gemaskeerd, de karakters blijven behouden (niet helemaal intact gelaten maar nog steeds te onderscheiden).


Antwoord 6

Stop met het verspillen van je tijd, voeg gewoon de volgende encoding="cp437"en errors='ignore'toe aan je code in zowel lezen als schrijven:

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

Godspeed


Antwoord 7

Voor degenen die in Anaconda in Windows werken, ik had hetzelfde probleem. Notepad++ help me om het op te lossen.

Open het bestand in Notepad++. Rechtsonder ziet u de huidige bestandscodering.
Zoek in het bovenste menu naast "Beeld" naar "Codering". Ga in "Encoding" naar "character sets" en zoek daar geduldig naar de enconding die je nodig hebt. In mijn geval werd de codering "Windows-1252" gevonden onder "West-Europees"


Antwoord 8

Voordat u de voorgestelde oplossing toepast, kunt u controleren wat het Unicode-teken is dat in uw bestand (en in het foutenlogboek) verscheen, in dit geval 0x90: https://unicodelookup.com/#0x90/1(of rechtstreeks op de Unicode Consortium-site http://www.unicode.org/charts/door te zoeken op 0x0090)

en overweeg dan om het uit het bestand te verwijderen.


Antwoord 9

Voor mij hielp het veranderen van de Mysql-tekencodering op dezelfde manier als mijn code om de oplossing te vinden. `photo=open('pic3.png',codering=latin1),
sterke tekst


Antwoord 10

voor mij werkte codering met utf16

file = open('filename.csv', encoding="utf16")

Other episodes