2010-11-09 4 views
2
 
Python 3.1.2 (r312:79147, Nov 9 2010, 09:41:54) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> open("/home/madsc13ntist/test_file.txt", "r").readlines()[6] 
Traceback (most recent call last): 
    File "", line 1, in 
    File "/usr/local/lib/python3.1/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xae in position 2230: unexpected code byte 

et pourtant ...python3: readlines() indices problème?

 
Python 2.4.3 (#1, Sep 8 2010, 11:37:47) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> open("/home/madsc13ntist/test_file.txt", "r").readlines()[6] 
'2010-06-14 21:14:43 613 xxx.xxx.xxx.xxx 200 TCP_NC_MISS 4198 635 GET http www.thelegendssportscomplex.com 80 /thumbnails/t/sponsors/145x138/007.gif - - - DIRECT www.thelegendssportscomplex.com image/gif http://www.thelegendssportscomplex.com/ "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.1; MS-RTC LM 8)" OBSERVED "Sports/Recreation" - xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx\r\n' 

ne quelqu'un a une idée pourquoi .readlines() [6] ne fonctionne pas pour python-3, mais fonctionne dans 2.4?

aussi ... Je pensais que 0xAE était ®

+0

C'est une erreur de codage. L'indexation n'a rien à voir avec ça (elle ne peut même pas être évaluée). – delnan

+0

utilise 'open (.., 'rb')' dans Python3 pour émuler le comportement de Python 2.x. – jfs

Répondre

0

De l'Python wiki:

Le UnicodeDecodeError se produit normalement lors du décodage d'une chaîne str à partir d'un certain codage. Depuis codages carte seulement un nombre limité de chaînes str à caractères unicode, une séquence illégale de caractères str provoquera le décodage spécifique à codage() à l'échec

Il semble que vous avez un codage différent que vous pensez faire.

+0

bon à savoir et merci pour votre réponse mais cela ne répond toujours pas à la question sous-jacente. à savoir, pourquoi est-ce seulement un problème dans 3.x et pas dans 2.x? – MadSc13ntist

+0

Ma conjecture est Python 3 utilise un schéma de codage différent de 2 car il est une différence majeure entre les deux – Woot4Moo

0

open fonction doc:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 

lecture de fichiers en utilisant le codage pour toujours:

open("/home/madsc13ntist/test_file.txt", "r",encoding='iso8859-1').readlines()[6] 

ne tiennent pas compte de décodage erreur? Définir les erreurs = 'ignore'. La valeur par défaut de 'errors' est 'None', même chose que 'strict'.

0

Comme il ya environ deux ans de poser la question, vous connaissez probablement déjà la raison. Fondamentalement, les chaînes Python 3 sont des chaînes Unicode. Pour les rendre abstraits, vous devez indiquer à Python quel encodage est utilisé pour le fichier.

Les chaînes Python 2 sont en fait des séquences d'octets et Python se sent bien pour lire tous les octets du fichier. Certains caractères sont interprétés (nouvelles lignes, onglets, ...), mais le reste est laissé intact.

Python 3 open() est similaire à Python 2 codecs.open().

... l'heure est venue ... de fermer la question en acceptant l'une des réponses.