UnicodeDecodeError: il codec 'charmap' non può decodificare il byte X in posizione Y: i caratteri sono mappati su <finedfin>


550

Sto cercando di ottenere un programma Python 3 per eseguire alcune manipolazioni con un file di testo pieno di informazioni. Tuttavia, quando provo a leggere il file ottengo il seguente errore:

 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
Per lo stesso errore questa soluzione mi ha aiutato, soluzione dell'errore charmap
Shubham Sharma,

2
Vedi Elaborazione di file di testo in Python 3 per capire perché ricevi questo errore.
Andreas Haferburg,

Risposte:


961

Il file in questione non utilizza la CP1252codifica. Sta usando un'altra codifica. Quale devi capire tu stesso. Quelli comuni sono Latin-1e UTF-8. Poiché 0x90 in realtà non significa nulla Latin-1, UTF-8(dove 0x90 è un byte di continuazione) è più probabile.

Si specifica la codifica quando si apre il file:

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

19
Bene, ho avuto quel problema con un po 'di codice Python 2.7 che ho provato a eseguire in Python 3.4. Latin-1 ha funzionato per me!
marzo 1

2
se stai usando Python 2.7 e ricevi lo stesso errore, prova il iomodulo:io.open(filename,encoding="utf8")
christopherlovell,

9
@ 1vand1ng0: ovviamente opere Latin-1; funzionerà per qualsiasi file indipendentemente dalla codifica effettiva del file. Questo perché tutti i 256 valori di byte possibili in un file hanno un punto di codice Latin-1 su cui mappare, ma ciò non significa che ottieni risultati leggibili! Se non conosci la codifica, anche aprire il file in modalità binaria potrebbe essere meglio che assumere Latin-1.
Martijn Pieters

1
È Unicode per impostazione predefinita, ma Unicode non è una codifica. 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)anche dopo aver usato questo sto ricevendo lo stesso errore. Ho provato anche con altre codifiche ma tutte invano. In questo codice sto anche usando from geotext import GeoText. Si prega di suggerire una soluzione.
Salah,

47

Solo per aggiungere nel caso in cui file = open(filename, encoding="utf8")non funziona provarefile = open(filename, errors='ignore')


Mille grazie - lo proverò. Ci sono alcuni caratteri non validi in parti di file che non mi interessano.
Stephen Nutt,

6
Avvertenza: ciò comporterà la perdita di dati quando si incontrano caratteri sconosciuti (che può andare bene a seconda della situazione).
Hans Goldman,

34

Come estensione alla risposta di @ LennartRegebro :

Se non riesci a capire quale codifica utilizza il tuo file e la soluzione sopra non funziona (non lo è utf8) e ti sei trovato a indovinare - ci sono strumenti online che potresti usare per identificare quale codifica sia. Non sono perfetti ma di solito funzionano bene. Dopo aver capito la codifica, dovresti essere in grado di utilizzare la soluzione sopra.

MODIFICARE: (copiato dal commento)

Un editor di testo abbastanza popolare Sublime Textha un comando per visualizzare la codifica se è stato impostato ...

  1. Vai a View-> Show Console(o Ctrl+ `)

inserisci qui la descrizione dell'immagine

  1. Digita il campo in fondo view.encoding()e spera per il meglio (non sono riuscito a ottenere nulla, Undefinedma forse avrai più fortuna ...)

inserisci qui la descrizione dell'immagine


2
Alcuni editor di testo forniranno anche queste informazioni. So che con Vim puoi ottenerlo tramite :set fileencoding( da questo link )
PaxRomana99

3
Sublime Text, anche - apri la console e digita view.encoding().
JimmidyJoo,

in alternativa, è possibile aprire il file con Blocco note. "Salva con nome" e vedrai un
menu

9

In alternativa, se non è necessario per decodificare il file, come ad esempio di caricare il file su un sito web, open(filename, 'rb'). r = lettura, b = binario


Grazie, questo è stato il caso del mio problema
shahin gh

6

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

Perché? Quando si usa:

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

Python presuppone che il file usi la stessa tabella codici dell'ambiente corrente (cp1252 nel caso del post di apertura) e prova a decodificarlo sul proprio UTF-8 predefinito. Se il file contiene caratteri di valori non definiti in questa tabella codici (come 0x90), otteniamo UnicodeDecodeError. A volte non conosciamo la codifica del file, a volte la codifica del file potrebbe non essere gestita da Python (come ad esempio cp790), a volte il file può contenere codifiche miste.

Se tali personaggi non sono necessari, si può decidere di sostituirli con punti interrogativi, con:

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

Un'altra soluzione alternativa è utilizzare:

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

I personaggi vengono quindi lasciati intatti, ma verranno mascherati anche altri errori.

Una buona soluzione è quella di specificare la codifica, ma non alcuna codifica (come cp1252), ma quella che ha TUTTI i caratteri definiti (come cp437):

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

La tabella codici 437 è la codifica DOS originale. Tutti i codici sono definiti, quindi non ci sono errori durante la lettura del file, nessun errore viene mascherato, i caratteri vengono conservati (non del tutto lasciati intatti ma comunque distinguibili).


1
Wow, grazie. Questa è l'unica decodifica che funziona per me.
Kowalski,

1

Per quelli che lavorano in Anaconda in Windows, ho avuto lo stesso problema. Notepad ++ mi aiuta a risolverlo.

Apri il file in Notepad ++. In basso a destra ti dirà la codifica del file corrente. Nel menu in alto, accanto a "Visualizza" trova "Codifica". In "Codifica" vai su "set di caratteri" e lì con pazienza cerca la codifica di cui hai bisogno. Nel mio caso la codifica "Windows-1252" è stata trovata sotto "Europa occidentale"


1

Smetti di perdere tempo, aggiungi quanto segue encoding="cp437"e errors='ignore'al tuo codice sia in lettura che in scrittura:

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

Godspeed


Certo signore. Ricevuto. Nessun tempo perso. Grazie. Vorresti una tazza di caffè o un buon vino?
Pramesh Bajracharya il

0

per me cambiare il carattere Mysql codificando lo stesso del mio codice mi ha aiutato a risolvere la soluzione. `photo = open ('pic3.png', encoding = latin1), testo forte inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.