¿Hay alguna manera de imprimir cadenas de forma colorida con python?imprimir cadena de colores a la consola con python
Por ejemplo, ¿puedo imprimir una parte de la cadena roja o algo así en una consola? Uso Mac OS X.
¿Hay alguna manera de imprimir cadenas de forma colorida con python?imprimir cadena de colores a la consola con python
Por ejemplo, ¿puedo imprimir una parte de la cadena roja o algo así en una consola? Uso Mac OS X.
Esto funciona para consolas Linux que soportan los colores:
CODE={
'ENDC':0, # RESET COLOR
'BOLD':1,
'UNDERLINE':4,
'BLINK':5,
'INVERT':7,
'CONCEALD':8,
'STRIKE':9,
'GREY30':90,
'GREY40':2,
'GREY65':37,
'GREY70':97,
'GREY20_BG':40,
'GREY33_BG':100,
'GREY80_BG':47,
'GREY93_BG':107,
'DARK_RED':31,
'RED':91,
'RED_BG':41,
'LIGHT_RED_BG':101,
'DARK_YELLOW':33,
'YELLOW':93,
'YELLOW_BG':43,
'LIGHT_YELLOW_BG':103,
'DARK_BLUE':34,
'BLUE':94,
'BLUE_BG':44,
'LIGHT_BLUE_BG':104,
'DARK_MAGENTA':35,
'PURPLE':95,
'MAGENTA_BG':45,
'LIGHT_PURPLE_BG':105,
'DARK_CYAN':36,
'AUQA':96,
'CYAN_BG':46,
'LIGHT_AUQA_BG':106,
'DARK_GREEN':32,
'GREEN':92,
'GREEN_BG':42,
'LIGHT_GREEN_BG':102,
'BLACK':30,
}
def termcode(num):
return '\033[%sm'%num
def colorstr(astr,color):
return termcode(CODE[color])+astr+termcode(CODE['ENDC'])
if __name__=='__main__':
astr='yippy skippy'
# for num in range(300):
# color=termcode(num)
# print('%s: %s'%(num,color+astr+termcode(CODE['ENDC'])))
for key in sorted(CODE.keys()):
print('%s: %s'%(key,colorstr(astr,key)))
print(colorstr('Red','RED'))
Aquí es un ejemplo del uso colorstr
para hacer un registrador coloreada:
import logging
import copy
logger=logging.getLogger(__name__)
class ColoredFormatter(logging.Formatter):
# A variant of code found at http://stackoverflow.com/questions/384076/how-can-i-make-the-python-logging-output-to-be-colored
LEVELCOLOR = {
'DEBUG': 'BLUE',
'INFO': 'BLACK',
'WARNING': 'PURPLE',
'ERROR': 'RED',
'CRITICAL': 'RED_BG',
}
def __init__(self, msg):
logging.Formatter.__init__(self, msg)
def format(self, record):
record = copy.copy(record)
levelname = record.levelname
if levelname in self.LEVELCOLOR:
record.levelname = colorstr(levelname,self.LEVELCOLOR[levelname])
record.name = colorstr(record.name,'BOLD')
record.msg = colorstr(record.msg,self.LEVELCOLOR[levelname])
return logging.Formatter.format(self, record)
if __name__=='__main__':
logger.setLevel(logging.DEBUG)
console = logging.StreamHandler()
console.setFormatter(
ColoredFormatter('%(name)s: %(message)s (%(filename)s:%(lineno)d)'))
logger.addHandler(console)
fh = logging.FileHandler('/tmp/test.log','w')
fh.setFormatter(logging.Formatter('%(name)s: %(message)s'))
logger.addHandler(fh)
logger.debug('debug')
logger.info('info')
logger.warning('Warning')
logger.error('ERROR')
logger.critical('CRITICAL!!!')
Este ejemplo registros tanto a la consola (stderr
) y un archivo (/tmp/test.log
). El mensaje a la consola se colorea, pero la salida al archivo se deja en blanco.
Excelente: Hubiera elegido su solución. Gracias. – Benjamin
PD: imprimo ambos en la consola y registro en el archivo. En el archivo, las etiquetas de color aparecen, ¿hay alguna forma de eliminarlas al escribir en el archivo convirtiendo la cadena a algún otro formato? – Benjamin
@Benjamin: ¿Está utilizando el módulo 'logging', o emitiendo declaraciones' print' separadas (una para la consola y otra para el archivo)? – unutbu
Puede usar colorama, pero úselo con moderación.
+1. La primera vez que me enteré, ¡y funciona en Windows! Esperaba que funcionara en Linux y OS X, pero fue una agradable sorpresa. –
Otras alternativas son:
He jugado con ellos en Windows. No sé cómo se comportan en OSX.
Si desea hacer esto con un esfuerzo mínimo, puede utilizar la biblioteca tendo.colorer.
Con solo importarlo, te coloreará el registro en todas las plataformas, sin romper el registro redirigido.
También podría usarlo para mostrar mensajes de colores personalizados si lo desea, ya que contiene una biblioteca ANSI multiplataforma y un ayudante para ella.
imprimir? ¿Quieres decir imprimir en una consola Linux? ¿O imprimir en una consola de Windows? ¿O mostrar en una página HTML? ¿Qué quieres decir? –