Python 输出彩色文本的几种方法
Python 输出彩色文本的几种方法
我们编程时所使用的文本编辑器(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'
其中 \x1b
是 ESC
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
中的两个核心函数是 colored
和 cprint
。它们都用于生成和输出彩色文本,但功能和使用方式略有不同:
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 消息')
输出:
总结
colorama
或 termcolor
都是不错的选择。rich
是最佳选择。作者:Z.2.H