2017-07-09 2 views
0

J'ai une liste contenant des caractères spéciaux (par exemple é ou un espace blanc) et lorsque j'imprime la liste, ces caractères sont imprimés avec leur code Unicode, alors qu'ils sont imprimés correctement si j'imprime le éléments de la liste séparément:Imprimer les caractères spéciaux dans la liste en Python

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

my_list = ['éléphant', 'Hello World'] 
print(my_list) 
print(my_list[0]) 
print(my_list[1]) 

La sortie de ce code est

['\xc3\xa9l\xc3\xa9phant', 'Hello World']

éléphant

Hello World

Et je voudrais avoir ['éléphant', 'Hello World'] pour la première sortie. Que devrais-je changer?

+1

Vous pouvez faire quelque chose comme ça pour encoder votre déclaration 'print':' >>> print repr (my_list) .decode ("unicode-évasion") .encode ('latin-1') ' J'ai posté cela comme une réponse mais je l'ai supprimé puisque je l'ai seulement testé dans python2, donc je commente maintenant. –

+0

@ ViníciusAguiar J'utilisais en effet python2. Votre réponse fonctionne bien si vous remplacez «latin-1» par «utf-8» – fonfonx

+0

Oh, c'est bien! Je ne vais pas le supprimer car il semble qu'il y ait déjà quelques bonnes réponses. Merci de me le faire savoir! =) –

Répondre

2

Si possible, passez à Python 3 et vous obtiendrez le résultat attendu.

Si vous devez le faire fonctionner en Python 2, puis utilisez unicode cordes:

my_list = [u'éléphant', u'Hello World'] 

La façon dont vous avez en ce moment, Python interprète la première chaîne comme une série d'octets avec des valeurs '\xc3\xa9l\xc3\xa9phant' qui ne sera converti en points de code Unicode qu'après décodage UTF-8 correctement: '\xc3\xa9l\xc3\xa9phant'.decode('utf8') == u'\xe9l\xe9phant'.

Si vous souhaitez imprimer la liste repr et sortir "unicode", vous devrez l'encoder manuellement en UTF-8 (si c'est ce que votre terminal comprend).

>>> print repr(my_list).decode('unicode-escape').encode('utf8') 
[u'éléphant', u'Hello World'] 

Mais il est plus facile de le formater manuellement:

>>> print ", ".join(my_list) 
éléphant, Hello World 
+0

qu'est-ce que 'repr' exactement? – fonfonx

+1

['repr'] (https://docs.python.org/2/library/functions.html#repr) renvoie une représentation imprimable d'un objet qui peut généralement être retourné à un objet avec [' eval'] (https://docs.python.org/2/library/functions.html#eval). Quand vous appelez 'print my_list', Pyhton2 est en train d'imprimer' str (my_list) ', qui est pour des listes égales à' repr (my_list) ', qui à son tour compose une liste imprimable de' repr's de l'élément individuel. Puisque les chaînes 'unicode' ne sont pas vraiment natives dans Python2, ce que nous obtenons avec' repr (my_list) 'est' "[u '\\ xe9l \\ xe9phant', u'Hello World ']" ', avec des points de code unicode échappés . – randomir

2

Réponse courte, vous devez implémenter vous-même, si vous voulez garder la sortie dans ce format:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

my_list = ['éléphant', 'Hello World'] 

def print_list (l): 
    print ("[" + ", ".join(["'%s'" % str(x) for x in l]) + "]") 

print_list (my_list) 

Qui génère le

['éléphant', 'Hello World'] 

Cependant, notez qu'il mettrait tous les éléments entre guillemets (nombres pairs, par exemple), de sorte que vous pourriez avoir besoin d'une implémentation plus complexe, si vous attendez autre chose que des chaînes sur votre liste.

réponse plus longue

Le problème est que Python fonctionne str(my_list) sous le capot, avant de l'imprimer. Et cela, à son tour, exécute repr() sur chacun des éléments de la liste.

Maintenant, repr() sur une chaîne renvoie une représentation ASCII uniquement de la chaîne. C'est-à-dire que les '\ xc3' que vous voyez sont une barre oblique inverse réelle, un 'c' réel et un réel '3' caractères.

Vous ne pouvez pas contourner cela, comme le problème est sur l'implémentation de list.__str__(). Ci-dessous, un exemple de programme pour le démontrer.

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

# vi: ai sts=4 sw=4 et 

import pprint 

my_list = ['éléphant', 'Hello World'] 

# under the hood, python first runs str(my_list), before printing it 
my_list_as_string = str(my_list) 

# str() on a list runs repr() on each of the elements. 
# However, it seems that __repr__ on a string transforms it to an 
# ASCII-only representation 
print ('str(my_list) = %s' % str(my_list)) 
for c in my_list_as_string: 
    print c 
print ('len(str(my_list)) = %s' % len(str(my_list))) 
print ("\n") 

# Which we can confirm here, where we can see that it it also adds the quotes: 
print ('repr("é") == %s' % repr("é")) 
for c in repr("é"): 
    print c 
print ('len(repr("é")) == %s' % len(repr("é"))) 
print ("\n") 

# Even pprint fails 
print ("pprint gives the same results") 
pprint.pprint(my_list) 

# It's useless to try to encode it, since all data is ASCII 
print "Trying to encode" 
print (my_list_as_string.encode ("utf8")) 

qui génère ceci:

str(my_list) = ['\xc3\xa9l\xc3\xa9phant', 'Hello World'] 
[ 
' 
\ 
x 
c 
3 
\ 
x 
a 
9 
l 
\ 
x 
c 
3 
\ 
x 
a 
9 
p 
h 
a 
n 
t 
' 
, 

' 
H 
e 
l 
l 
o 

W 
o 
r 
l 
d 
' 
] 
len(str(my_list)) = 41 


repr("é") == '\xc3\xa9' 
' 
\ 
x 
c 
3 
\ 
x 
a 
9 
' 
len(repr("é")) == 10 


pprint gives the same results 
['\xc3\xa9l\xc3\xa9phant', 'Hello World'] 
Trying to encode 
['\xc3\xa9l\xc3\xa9phant', 'Hello World']