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>`
Réponses:
Le fichier en question n'utilise pas l'
CP1252
encodage. Il utilise un autre encodage. Lequel vous devez comprendre vous-même. Les plus courants sontLatin-1
etUTF-8
. Étant donné que 0x90 ne signifie rien en faitLatin-1
,UTF-8
(où 0x90 est un octet de continuation) est plus probable.Vous spécifiez l'encodage lorsque vous ouvrez le fichier:
la source
io
module:io.open(filename,encoding="utf8")
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 égalementfrom geotext import GeoText
. Veuillez suggérer une solution.Juste pour ajouter au cas où
file = open(filename, encoding="utf8")
cela ne fonctionne pas, essayezfile = open(filename, errors='ignore')
la source
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 Text
a une commande pour afficher l'encodage s'il a été défini ...View
->Show Console
(ou Ctrl+ `)view.encoding()
et espérez le meilleur (je n'ai rien pu obtenirUndefined
mais peut-être que vous aurez plus de chance ...)la source
:set fileencoding
(à partir de ce lien )view.encoding()
.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 = binairela source
TLDR? Essayer:
file = open(filename, encoding='cp437)
Pourquoi? Quand on utilise:
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:
Une autre solution consiste à utiliser:
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):
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).
la source
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"
la source
Arrêtez de perdre votre temps, ajoutez simplement ce qui suit
encoding="cp437"
eterrors='ignore'
à votre code en lecture et en écriture:Godspeed
la source
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
la source