2010-07-20 32 views
0

J'utilise Python 2.6.1 et j'ai un problème lié à utf-8 avec mon code. Ce problème est reproductible avec ce code:Python utf-8 handling

# -*- coding: utf-8 -*- 
import os, sys 
import string, time 
import codecs, re 
bDATA='"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankolé","John Hawkes"' 
print (bDATA) 
fileObj = codecs.open("btvresp1.txt", "r", "utf-8") 
data = fileObj.read() 
print (data) 

La première impression de bDATA fonctionne très bien. Toutefois, si les mêmes données dans le fichier fichier btcresp1.txt, python se plaint comme suit:

cat btvresp2.txt 
"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankol?","John Hawkes" 

python 
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> # -*- coding: utf-8 -*- 
... 
>>> import os, sys 
>>> import string, time 
>>> import codecs, re 
>>> bDATA='"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankol","John Hawkes"' 
>>> print (bDATA) 
"Domenick Lombardozzi","Eddie Marsan","Isaach De Bankol","John Hawkes" 
>>> fileObj = codecs.open("btvresp2.txt", "r", "utf-8") 
>>> data = fileObj.read() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/codecs.py", line 666, in read 
    return self.reader.read(size) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/codecs.py", line 472, in read 
    newchars, decodedbytes = self.decode(data, self.errors) 
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 55-57: invalid data 

Je ne suis pas sûr de savoir pourquoi les mêmes données lorsqu'elles sont lues à partir d'un fichier provoque des problèmes. Quelqu'un peut-il éclaircir pourquoi ce comportement et comment je peux résoudre ce problème?

Merci d'avance!

+1

Etes-vous sûr que le fichier btvresp1.txt est codé en utf-8? – nos

Répondre

2

Il semble que le contenu de votre fichier ne soit pas codé en UTF-8. Êtes-vous sûr de ne pas l'avoir enregistré dans un autre encodage? Lorsque vous cat le fichier, le terminal affiche un ? au lieu du é, ce qui suggère également un problème d'encodage dans le fichier, puisque votre terminal semble utiliser UTF-8. Vous avez également deux fichiers, btvresp1.txt et btvresp2.txt. Utilisez-vous le bon?

+0

Mon mauvais .. btvresp1.txt et btvresp2.txt diffèrent très peu (j'ai supprimé quelques noms de la liste bDATA). Depuis que j'utilise un Mac, l'application Terminal est au courant de l'UTF-8 et je suis capable de voir é très bien. – Bapatla

1

codecs.open renvoie un objet dont la méthode read retourne une chaîne de caractères unicode , pas une chaîne d'octets codée - qui est le point de l'ensemble de la fonction codecs.open. Donc, votre print (data), si et quand vous y arriverez, sera complètement, radicalement différent de votre travail print (bDATA): ce dernier est en train d'imprimer des chaînes octets encodées en utf-8, ce dernier essaiera d'imprimer des objets Unicode (qui peuvent ou non travail en fonction de votre environnement - mais, vous devriez être bien sur un Terminal.app mis à utiliser l'encodage utf-8).

Cependant, vos problèmes viennent beaucoup plus tôt: l'objet de type fichier produit par les codecs affirme que les octets 55 à 57 sont et non un codage utf-8 valide. La façon de vérifier cela est quelque chose comme ...:

>>> f = open("btvresp2.txt", "rb") 
>>> print repr(f.read()[50:65]) 

où je montre également quelques octets avant et après, pour le contexte. Si vous faites cela et éditez votre question pour nous montrer les résultats, nous pourrions être en mesure de deviner quel est le codage de votre fichier (la seule certitude, à ce stade, est pas en encodage utf-8).

+0

@Bapatia, le '\ xe9' pour les minuscules e avec accent aigu est ** pas ** utf-8 - c'est probablement un' ISO-8859-x' (où 'x' pourrait être par exemple' 1' ou '15 ') ou peut-être' CP-1252' ou quelque chose comme ça. Essayez de le lire w/iso-8859-1 et voyez ce qui se passe. –

+0

Oui! En utilisant iso-8859-1, j'ai été capable d'imprimer le personnage correctement ... Donc, à l'heure actuelle, il semble que le framework que j'utilise ait un problème avec iso-8859-1 - il est par défaut utf8 même quand je spécifier d'autres encodages .. Merci pour votre aide! – Bapatla