Python 3 chokes sur CP-1252/ANSI lecture
Je suis en train de travailler sur une série d'analyseurs où je reçois un tas de retraçage de mes tests unitaires comme:
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 0x81 in position 112: character maps to <undefined>
Les fichiers sont ouvert avec open (), sans aucun supplément de arguemnts. Puis-je passer des arguments supplémentaires à open() ou utiliser quelque chose dans le module de codecs pour ouvrir ces différemment?
C'est venu avec le code qui a été écrit en Python 2 et converti à 3 avec le 2to3 outil.
Mise à JOUR: il s'avère que c'est à la suite de nourrir un zipfile dans l'analyseur. L'unité de test s'attend effectivement à ce que cela arrive. L'analyseur doit le reconnaître comme quelque chose qui ne peut pas être analysée. Donc, j'ai besoin de changer mon traitement d'exception. Dans le processus de le faire maintenant.
Vous devez vous connecter pour publier un commentaire.
Position 0x81 est assignée en Windows-1252 (aka cp1252). Il est affecté à U+0081 HAUTE OCTET de PRÉRÉGLAGE (HOP) caractère de contrôle en Latin-1 (ou ISO 8859-1). Je peux reproduire ton erreur en Python 3.1 comme ceci:
ou à un fichier existant:
Maintenant pour traiter ce dossier, comme en Latin-1, vous passez le
encoding
argument, comme codeape suggéré:Méfiez-vous qu'il existe des différences entre Windows-1257 et Latin-1 encodages, par exemple, le Latin-1 n'a pas de “guillemets”. Si le fichier que vous êtes de traitement est un fichier texte, demandez-vous ce que \x81 est de faire en elle.
Vous pourrez vous détendre à la gestion des erreurs.
Par exemple:
Ou:
Voir les docs.
EDIT:
Mais êtes-vous certain que le problème est dans la lecture du fichier? Se pourrait-il que l'exception se produit lorsque quelque chose est écrit dans la console? Vérifier http://wiki.python.org/moin/PrintFails
Tous les fichiers ne sont pas "Unicode". Unicode est une représentation interne qui doit être codé. Vous devez déterminer pour chaque fichier de codage a été utilisé, et de préciser qu'en cas de nécessité lorsque le fichier est ouvert.
Que la traçabilité en amont et message d'erreur indiquent, le fichier en question n'est PAS codé dans
cp1252
.Si il est codé dans
latin1
, le"\x81"
que c'est de se plaindre est un C1 caractère de contrôle qui n'a même pas de nom (Unicode). Envisagerlatin1
très peu de chances d'être valide.Vous dire "certains des fichiers sont analysés avec xml.dom.minidom" -- analysé avec succès ou échec?
Un fichier XML valide doit déclarer son encodage (la valeur par défaut est UTF-8) dans la première ligne, et vous ne devriez pas besoin de spécifier un encodage dans votre code. Nous montrer le code que vous utilisez pour faire du xml.dom.minidom de l'analyse.
"pour d'autres, directement comme iterables" -- exemple de code s'il vous plaît.
Suggestion: essayez d'ouvrir certaines de chaque type de fichier dans votre navigateur. Puis cliquez sur Afficher, puis cliquez sur l'Encodage des Caractères (Firefox) ou de l'Encodage (Internet Explorer). Ce codage est le navigateur deviné [généralement de manière fiable]?
Autres possible de codage des indices: Quelles sont les langues utilisées dans le texte dans les fichiers? Où avez-vous récupérer les fichiers à partir?
Remarque: veuillez modifier votre question par une clarification de l'information, ne pas la réponse dans les commentaires.