Python 输出彩色文本的几种方法

Python 输出彩色文本的几种方法

  • 方法 1:使用 ANSI 转义序列
  • 方法 2:使用 `colorama`
  • 代码示例
  • 解析
  • 高级用法
  • 方法 3:使用 `termcolor`
  • 代码示例
  • 方法 4:使用 `rich`
  • rich.print
  • console.print
  • RichHandler
  • 总结
  • 我们编程时所使用的文本编辑器(Vim, Visual Studio Code, …)或者 IDE(PyCharm, Visual Studio, …)都允许我们根据自己的喜好选择和配置语法高亮,这可以提高代码的可读性,但程序运行时的输出信息通常没有颜色。如果我们用不同颜色的输出来区分不同类型的信息,这样就可以更加清晰地看到程序的运行状态,发生错误时也能快速定位问题。

    例如在日志系统中我们可以:

  • 用红色输出错误信息,方便快速定位问题;
  • 用黄色输出警告信息,提醒用户注意;
  • 用绿色输出成功信息,表示任务完成或成功。
  • 在 Python 中,我们可以有以下几种方法实现彩色输出。

    方法 1:使用 ANSI 转义序列

    详情见本人之前的一篇博文 使用 ANSI 转义序列输出彩色文本。

    方法 2:使用 colorama

    colorama 是一个跨平台的用于在 Python 中生成彩色终端输出的库,特别是在需要支持 Windows 系统的终端时非常有用。在大部分现代终端中(如 Linux 或 macOS), colorama 的主要功能是提供便捷的接口;在 Windows 系统中,它的重点是处理 ANSI 转义序列的兼容性。

    代码示例

    from colorama import init, Fore, Back, Style
    
    # 初始化 Colorama(特别是 Windows 平台需要)
    init()
    
    # 输出彩色文本
    print(Fore.RED + '这是红色的文字')
    print(Back.YELLOW + '这是带黄色背景的文字')
    print(Style.BRIGHT + '这是加粗的文字')
    
    # 重置样式,避免后续输出受影响
    print(Style.RESET_ALL + '恢复默认样式')
    

    输出:

    解析

    其实这里的 Fore.RED 等只是 colorama 实现的 ANSI 转义码的助记名称.

    print(repr(Fore.RED))         # -> '\x1b[31m'
    print(repr(Back.YELLOW))      # -> '\x1b[43m'
    print(repr(Style.BRIGHT))     # -> '\x1b[1m'
    print(repr(Style.RESET_ALL))  # -> '\x1b[0m'
    

    其中 \x1bESC 16 进制 ASCII 码,8 进制是 \033

    高级用法

    使用 ANSI 转义序列输出彩色文本中实现的彩色日志系统可以很容易实现。

    from colorama import init, Fore, Style
    
    
    class Logger:
        def debug(self, msg):
            print(Fore.GREEN + msg + Style.RESET_ALL)
    
        def info(self, msg):
            print(Fore.WHITE + Style.BRIGHT + msg + Style.RESET_ALL)
    
        def warnging(self, msg):
            print(Fore.YELLOW + msg + Style.RESET_ALL)
    
        def error(self, msg):
            print(Fore.RED + msg + Style.RESET_ALL)
    
    
    if __name__ == '__main__':
        init()
        logger = Logger()
    
        logger.debug('这是 DEBUG 信息')
        logger.info('这是日志信息')
        logger.warnging('这是警告信息')
        logger.error('这是错误信息')
    

    输出:

    方法 3:使用 termcolor

    termcolor 是一个轻量级的 Python 库,用于在终端输出彩色文本。它通过添加 ANSI 转义序列来更改文本的前景色、背景色以及应用样式,如加粗和下划线等。termcolor 中的两个核心函数是 coloredcprint。它们都用于生成和输出彩色文本,但功能和使用方式略有不同:

  • colored 用于生成带颜色和样式的字符串。它不会直接打印,而是返回一个格式化后的字符串,你可以将它用于各种用途,比如拼接、存储、或在其他地方打印。
  • cprint 是一个快捷函数,它的作用是将带颜色的文本直接打印到终端,省去了调用 print 的步骤。
  • 代码示例

    from termcolor import colored, cprint
    
    # 添加前景色
    print(colored('这是红色的文字', 'red'))
    print(colored('这是绿色的文字', 'green'))
    
    # 添加前景色和背景色
    print(colored('这是蓝色背景的文字', 'white', 'on_blue'))
    
    # 添加文字样式
    # 通过 attrs 参数支持额外样式
    print(colored('这是加粗的文字', 'yellow', attrs=['bold']))
    print(colored('这是下划线的文字', 'cyan', attrs=['underline']))
    print(colored('这是闪烁的文字', 'magenta', attrs=['blink']))
    print(colored('组合示例:加粗+红色+蓝色背景', 'red', 'on_blue', attrs=['bold']))
    
    # 直接使用 cprint
    cprint('这是加粗的文字', 'yellow', attrs=['bold'])
    cprint('这是下划线的文字', 'cyan', attrs=['underline'])
    cprint('这是闪烁的文字', 'magenta', attrs=['blink'])
    cprint('组合示例:加粗+红色+蓝色背景', 'red', 'on_blue', attrs=['bold'])
    

    输出:

    方法 4:使用 rich

    rich 是一个功能强大的 Python 库,用于在终端中生成精美的输出。它支持彩色文本、表格、进度条、标记(markup)、树形结构等多种高级格式化输出。使用 rich 可以让命令行应用程序的输出更加直观和美观。rich 还支持漂亮的日志记录输出,可以替代标准的日志库 logging

    rich.print

    rich 提供的 print 函数支持丰富的格式化和彩色输出。直接使用 rich.print 替代内置 print,可以在字符串中嵌入样式标签控制颜色和样式。

    from rich import print
    
    # 彩色输出
    print("[bold red]这是红色加粗的文字[/bold red]")
    
    # 嵌套样式
    print("[green]绿色文字 [bold blue]嵌套蓝色加粗文字[/bold blue][/green]")
    
    # 支持变量格式化
    name = "Python"
    print(f"[italic magenta]欢迎使用 {name}![/italic magenta]")
    

    输出:

    console.print

    console.print 是 Rich 的核心方法,功能比 rich.print 更强大,适合复杂输出场景。

    from rich.console import Console
    
    console = Console()
    
    # 输出彩色文本
    console.print('[bold red]这是红色加粗的文字[/bold red]')
    
    # 输出带背景色的文本
    console.print('[white on blue]这是蓝色背景的文字[/white on blue]')
    
    # 直接渲染 Python 对象
    data = {'name': 'Python', 'version': 3.9}
    print(data)
    console.print(data, style='cyan')
    

    输出:

    RichHandler

    RichHandler 是 Rich 提供的日志处理器,用于美化 Python 的 logging 模块的输出。它可以将日志输出格式化为带有颜色、样式、时间戳和更易读的结构化信息,让日志在终端中看起来更加美观和易于调试。

    import logging
    from rich.logging import RichHandler
    
    # 配置日志格式和处理器
    logging.basicConfig(
        level=logging.DEBUG,  # 设置日志级别
        format='%(message)s',  # 简化日志输出
        datefmt='[%X]',  # 时间格式
        handlers=[RichHandler()],  # 使用 RichHandler 美化日志
    )
    
    # 获取日志器
    logger = logging.getLogger('rich')
    
    # 测试输出
    logger.debug('这是一个 DEBUG 消息')
    logger.info('这是一个 INFO 消息')
    logger.warning('这是一个 WARNING 消息')
    logger.error('这是一个 ERROR 消息')
    logger.critical('这是一个 CRITICAL 消息')
    

    输出:

    总结

  • 如果只是临时调试,ANSI 转义序列即可满足需求。
  • 如果你的需求只是简单地为终端输出添加颜色,coloramatermcolor 都是不错的选择。
  • 如果你需要更复杂的样式、日志美化,甚至进度条等高级功能,rich 是最佳选择。
  • 作者:Z.2.H

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 输出彩色文本的几种方法

    发表回复