用Python在控制台打印彩色字符串
有没有办法用Python把字符串打印得五颜六色的呢?
比如说,我能不能把字符串的某一部分打印成红色,或者其他颜色,显示在控制台上?我用的是Mac OS X。
4 个回答
2
还有其他一些选择:
- colorconsole,据说可以在OSX上使用。
- urwid,同样可以在OSX上使用。
- curses,这是一个库,但我知道它只适用于Linux。
- win curses,这个可以在Windows上使用。
- console
我在Windows上试过这些,不知道它们在OSX上的表现如何。
8
你可以使用 colorama 这个库,不过要适量使用。
8
这个方法适用于支持颜色的Linux控制台:
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'))
下面是一个使用 colorstr
来创建一个带颜色的日志记录器的例子:
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!!!')
这个例子同时将日志记录到控制台(stderr
)和一个文件(/tmp/test.log
)。发到控制台的消息是有颜色的,而写入文件的内容则是普通的,没有颜色。