UnicodeDecodeError: le codec 'charmap' ne peut pas décoder l'octet X en position Y: les caractères sont mappés à <non défini>

550

J'essaie d'obtenir un programme Python 3 pour faire quelques manipulations avec un fichier texte rempli d'informations. Cependant, lorsque j'essaie de lire le fichier, j'obtiens l'erreur suivante:

 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>`  
Eden Crow
la source
2
Pour la même erreur, cette solution m'a aidé, solution de l'erreur
charmap
2
Voir Traitement des fichiers texte en Python 3 pour comprendre pourquoi vous obtenez cette erreur.
Andreas Haferburg

Réponses:

961

Le fichier en question n'utilise pas l' CP1252encodage. Il utilise un autre encodage. Lequel vous devez comprendre vous-même. Les plus courants sont Latin-1et UTF-8. Étant donné que 0x90 ne signifie rien en fait Latin-1, UTF-8(où 0x90 est un octet de continuation) est plus probable.

Vous spécifiez l'encodage lorsque vous ouvrez le fichier:

file = open(filename, encoding="utf8")
Lennart Regebro
la source
19
Cool, j'ai eu ce problème avec du code Python 2.7 que j'ai essayé d'exécuter dans Python 3.4. Latin-1 a fonctionné pour moi!
1vand1ng0
2
si vous utilisez Python 2.7 et obtenez la même erreur, essayez le iomodule:io.open(filename,encoding="utf8")
christopherlovell
9
@ 1vand1ng0: bien sûr le latin-1 fonctionne; cela fonctionnera pour n'importe quel fichier, quel que soit l'encodage réel du fichier. C'est parce que les 256 valeurs d'octets possibles dans un fichier ont un point de code Latin-1 à mapper, mais cela ne signifie pas que vous obtenez des résultats lisibles! Si vous ne connaissez pas l'encodage, même ouvrir le fichier en mode binaire à la place pourrait être mieux que de supposer Latin-1.
Martijn Pieters
1
C'est unicode par défaut, mais unicode n'est pas un encodage. 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)même après avoir utilisé cela, je reçois la même erreur. J'ai également essayé avec d'autres encodages mais en vain. Dans ce code, j'utilise également from geotext import GeoText. Veuillez suggérer une solution.
Salah
47

Juste pour ajouter au cas où file = open(filename, encoding="utf8")cela ne fonctionne pas, essayezfile = open(filename, errors='ignore')

Declan Nnadozie
la source
Merci beaucoup - je vais essayer. Il y a des caractères invalides dans des parties de fichiers qui ne m'intéressent pas.
Stephen Nutt,
6
Avertissement: cela entraînera une perte de données lorsque des caractères inconnus sont rencontrés (ce qui peut être correct selon votre situation).
Hans Goldman
34

Dans le prolongement de la réponse de @ LennartRegebro :

Si vous ne pouvez pas dire quel encodage votre fichier utilise et que la solution ci-dessus ne fonctionne pas (ce n'est pas le cas utf8) et que vous vous êtes retrouvé à deviner - il existe des outils en ligne que vous pouvez utiliser pour identifier ce qu'est l'encodage. Ils ne sont pas parfaits mais fonctionnent généralement très bien. Après avoir compris l'encodage, vous devriez pouvoir utiliser la solution ci-dessus.

EDIT: (Copié du commentaire)

Un éditeur de texte assez populaire Sublime Texta une commande pour afficher l'encodage s'il a été défini ...

  1. Allez à View-> Show Console(ou Ctrl+ `)

entrez la description de l'image ici

  1. Tapez dans le champ en bas view.encoding()et espérez le meilleur (je n'ai rien pu obtenir Undefinedmais peut-être que vous aurez plus de chance ...)

entrez la description de l'image ici

Matas Vaitkevicius
la source
2
Certains éditeurs de texte fourniront également ces informations. Je sais qu'avec vim vous pouvez l'obtenir via :set fileencodingpartir de ce lien )
PaxRomana99
3
Sublime Text, aussi - ouvrez la console et tapez view.encoding().
JimmidyJoo
vous pouvez également ouvrir votre fichier avec le bloc-notes. «Enregistrer sous» et vous verrez une liste déroulante avec l'encodage utilisé
don_Gunner94
9

Sinon, si vous n'avez pas besoin de décoder le fichier, tel que le télécharger sur un site Web open(filename, 'rb'),. r = lecture, b = binaire

Kyle Parisi
la source
Merci, c'était le cas pour mon problème
shahin gh
6

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

Pourquoi? Quand on utilise:

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

Python suppose que le fichier utilise la même page de code que l'environnement actuel (cp1252 dans le cas de la publication d'ouverture) et essaie de le décoder en son propre UTF-8 par défaut. Si le fichier contient des caractères de valeurs non définies dans cette page de code (comme 0x90), nous obtenons UnicodeDecodeError. Parfois, nous ne connaissons pas l'encodage du fichier, parfois l'encodage du fichier peut être non géré par Python (comme par exemple cp790), parfois le fichier peut contenir des encodages mixtes.

Si de tels caractères sont inutiles, on peut décider de les remplacer par des points d'interrogation, avec:

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

Une autre solution consiste à utiliser:

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

Les caractères restent alors intacts, mais les autres erreurs seront également masquées.

Une assez bonne solution consiste à spécifier l'encodage, mais pas n'importe quel encodage (comme cp1252), mais celui qui a TOUS les caractères définis (comme cp437):

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

La page de codes 437 est l'encodage DOS d'origine. Tous les codes sont définis, il n'y a donc aucune erreur lors de la lecture du fichier, aucune erreur n'est masquée, les caractères sont préservés (pas tout à fait intacts mais toujours reconnaissables).

rha
la source
1
Wow, je vous remercie. C'est le seul décodage qui fonctionne pour moi.
Kowalski
1

Pour ceux qui travaillent dans Anaconda sous Windows, j'ai eu le même problème. Notepad ++ m'aide à le résoudre.

Ouvrez le fichier dans Notepad ++. En bas à droite, il vous indiquera l'encodage du fichier actuel. Dans le menu supérieur, à côté de "Affichage", recherchez "Encodage". Dans "Encodage", allez dans "jeux de caractères" et là, avec le patient, recherchez l'encodage dont vous avez besoin. Dans mon cas, le codage "Windows-1252" a été trouvé sous "Europe occidentale"

Antoni
la source
1

Arrêtez de perdre votre temps, ajoutez simplement ce qui suit encoding="cp437"et errors='ignore'à votre code en lecture et en écriture:

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

Godspeed

E.Zolduoarrati
la source
Bien sûr Monsieur. Bien reçu. Pas de temps perdu. Je vous remercie. Souhaitez-vous une tasse de café ou un bon vin?
Pramesh Bajracharya
0

pour moi, changer le caractère Mysql encodant le même que mon code a aidé à trier la solution. `photo = open ('pic3.png', encoding = latin1), texte fort entrez la description de l'image ici

Piyush raj
la source