使用 python 将彩色字符串打印到控制台

Posted

技术标签:

【中文标题】使用 python 将彩色字符串打印到控制台【英文标题】:print colorful string out to console with python 【发布时间】:2011-04-11 10:03:21 【问题描述】:

有没有办法用python以彩色方式打印字符串?

例如,我可以将字符串 red 的某些部分或其他内容打印到控制台吗?我使用 Mac OS X。

【问题讨论】:

打印?你的意思是打印到 Linux 控制台?或者打印到 Windows 控制台?还是显示在 html 页面中?什么意思? 【参考方案1】:

这适用于支持颜色的 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://***.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)。控制台的消息是彩色的,但文件的输出是纯色的。

【讨论】:

优秀:我会选择你的解决方案。谢谢。 PS:我既打印到控制台又登录到文件。在文件中,颜色标签会显示出来,有没有办法在写入文件时通过将字符串转换为其他格式来删除它们? @Benjamin:您是在使用logging 模块,还是发出单独的print 语句(一个到控制台,一个到文件)? 我使用屏幕上的打印语句和文件的 file.write() 语句制作了自己的记录器模块。我不知道存在日志记录模块。 @Benjamin:我建议从标准库切换到logging module。上面,我发布了一个小例子,说明如何将彩色消息记录到控制台,同时将普通消息记录到文件中。【参考方案2】:

您可以使用colorama,但要谨慎使用。

【讨论】:

+1。我第一次听说它,它可以在 Windows 上运行!我原以为它可以在 Linux 和 OS X 上运行,但这是一个惊喜。【参考方案3】:

其他选择是:

colorconsole 声称可以在 OSX 上工作 urwid 也适用于 OSX curses 在库中,但仅适用于 linux afaik win curses这对win有效 console

我在 Windows 中玩过它们。不知道它们在 OSX 中的行为。

【讨论】:

【参考方案4】:

如果您想以最少的努力做到这一点,您可以使用tendo.colorer 库。

只需导入它,它就会为您在所有平台上的登录着色,而不会破坏重定向的日志。

如果您愿意,您也可以使用它来显示自定义彩色消息,因为它包含一个跨平台 ANSI 库和一个帮助器。

【讨论】:

以上是关于使用 python 将彩色字符串打印到控制台的主要内容,如果未能解决你的问题,请参考以下文章

为啥 termcolor 在 Windows 控制台中输出控制字符而不是彩色文本?

使用 ANSI / VT100 代码在 PowerShell 控制台中输出彩色文本

读取彩色数字图像要控制台的数字

Python猜拳小游戏 彩色控制台版

有啥方法可以用 NSLog 进行彩色打印?

Python终端输出打印彩色字体的方法