2012-01-04 21 views
5
>>> s = 'auszuschließen' 
>>> print(s.encode('ascii', errors='xmlcharrefreplace')) 
b'auszuschließen' 
>>> print(str(s.encode('ascii', errors='xmlcharrefreplace'), 'ascii')) 
auszuschließen 

¿Existe alguna manera más bonita de imprimir cualquier cadena sin el b''?Impresión escapada Unicode en Python

EDIT:

sólo estoy tratando de imprimir caracteres de escape desde Python, y mi única queja es que Python agrega "b ''" cuando hago eso.

si quería ver el carácter real en un terminal tonto como Windows 7 es así, entonces me sale esto:

Traceback (most recent call last): 
    File "Mailgen.py", line 378, in <module> 
    marked_copy = mark_markup(language_column, item_row) 
    File "Mailgen.py", line 210, in mark_markup 
    print("TP: %r" % "".join(to_print)) 
    File "c:\python32\lib\encodings\cp437.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_map)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u2026' in position 29: character maps to <undefined> 
+1

¿por qué no estás usando 'print (s)'? ¿Por qué necesitas codificar como ascii? – jcollado

+0

Porque no creo que mi terminal admita todos los caracteres extraños que procesa mi código. –

+1

print (str (s.encode ('ascii', errors = 'ignorar'), 'ascii')) será aún más bonito, de todos modos. –

Respuesta

2
>>> s='auszuschließen…' 
>>> s 
'auszuschließen…' 
>>> print(s) 
auszuschließen… 
>>> b=s.encode('ascii','xmlcharrefreplace') 
>>> b 
b'auszuschlie&#223;en&#8230;' 
>>> print(b) 
b'auszuschlie&#223;en&#8230;' 
>>> b.decode() 
'auszuschlie&#223;en&#8230;' 
>>> print(b.decode()) 
auszuschlie&#223;en&#8230; 

Usted comienza con una cadena Unicode. Al codificarlo en ascii se crea un objeto bytes con los caracteres que desea. Python no lo imprimirá sin convertirlo de nuevo en una cadena y la conversión predeterminada coloca el b y las comillas. El uso de decode lo convierte explícitamente en una cadena; la codificación predeterminada es utf-8, y dado que su bytes solo consta de ascii que es un subconjunto de utf-8, está garantizado que funciona.

+0

Esta es la solución más elegante hasta aquí. Tenga en cuenta que mi terminal silenciosamente convierte '...' en '.' –

1

No todos los terminales pueden manejar más de una especie de juego de caracteres de 8 bits, eso es cierto . Pero no manejarán eso sin importar lo que hagas, realmente.

Al imprimir una cadena Unicode, suponiendo que su sistema operativo ha configurado correctamente el terminal, obtendrá el mejor resultado posible, lo que significa que los caracteres que el terminal no puede imprimir se reemplazarán con algún carácter, como un signo de interrogación o similar. Hacer esa traducción no mejorará realmente las cosas.

Actualización:

Puesto que usted quiere saber cómo son los personajes en la cadena, que en realidad quieren saber los códigos Unicode para ellos, o el equivalente XML en este caso. Eso es más inspección que impresión, y generalmente la parte b '' no es un problema per se.

Pero usted puede deshacerse de él fácilmente y hackily así:

print(repr(s.encode('ascii', errors='xmlcharrefreplace'))[2:-1]) 
+0

Rastreo (llamada más reciente pasado): Archivo "Mailgen.py", línea 378, en marked_copy = mark_markup (language_column, item_row) Archivo "Mailgen.py", la línea 210, en mark_markup de impresión ("TP: % r "%" ".join (to_print)) Archivo" c: \ python32 \ lib \ codificaciones \ cp437.py ", línea 19, en la codificación return codecs.charmap_encode (input, self.errors, encoding_map) [0 ] UnicodeEncodeError: el códec 'charmap' no puede codificar el carácter '\ u2026' en la posición 29: mapas de caracteres a

+0

@CeesTimmerman: Mira, ahí tienes el comienzo de una pregunta real. Deberías hacer uno. También incluya información sobre su terminal. –

+0

Bien: ¿Cómo imprimo Pythonicamente una cadena Unicode desconocida en el terminal Command de 64 bits de Windows 7 Enterprise (y preferiblemente en cualquier otro terminal también)? –

0

Dado que está utilizando Python 3, estás que ofrece la posibilidad de escribir print(s) a la consola.

Puedo estar de acuerdo en que, dependiendo de la consola, es posible que no se pueda imprimir correctamente, pero me imagino que la mayoría de los sistemas operativos modernos desde 2006 pueden manejar cadenas Unicode sin demasiado problema. Te animo a que lo pruebes y veas si funciona.

Alternativamente, se puede aplicar una codificación mediante la colocación de esto antes de cualquier línea en un archivo(similar a un tinglado):

# -*- coding: utf-8 -*- 

Esto obligará al intérprete para que sea como UTF-8.

+0

Gracias. Ya estoy usando eso. –

+0

Esta copia del terminal 64 Command de Windows Enterprise de 64 bits, por ejemplo, no desea imprimir caracteres que no están en el CP437, p. '\ u2026'. –

+1

1. '# - * - codificación: utf-8 - * -' está predeterminado en Python3 2. No cambia la forma en que 'print (s)' funciona. Solo afecta cómo se interpretan las cadenas literales. – jfs

3

Para ver la representación ASCII (como repr() en Python 2) para la depuración:

print(ascii('auszuschließen…')) 
# -> 'auszuschlie\xdfen\u2026' 

Para imprimir bytes:

sys.stdout.buffer.write('auszuschließen…'.encode('ascii', 'xmlcharrefreplace')) 
# -> auszuschlie&#223;en&#8230; 
+0

print (ascii()) se deshace de la b, pero no las comillas ... –

+0

@Lennart Regebro: correcto. '# ->' muestra eso. – jfs

+0

En una inspección más detallada, en mi terminal sys.stdout.buffer.write ('auszuschließen ... test'.encode (' ascii ',' xmlcharrefreplace ')) imprime: auszuschlie ß en.test24 No me gustan los casos especiales (no capturados) el valor de retorno se imprime), así que iré con la solución de decodificación(). –