使用 ANSI 转义序列输出彩色文本
我们编程时所使用的文本编辑器(Vim, Visual Studio Code, …)或者 IDE(PyCharm, Visual Studio, …)都允许我们根据自己的喜好选择和配置语法高亮,这可以提高代码的可读性,但程序运行时的输出信息通常没有颜色。如果我们用不同颜色的输出来区分不同类型的信息,这样就可以更加清晰地看到程序的运行状态,发生错误时也能快速定位问题。
例如在日志系统中我们可以:
- 用红色输出错误信息,方便快速定位问题;
- 用黄色输出警告信息,提醒用户注意;
- 用绿色输出成功信息,表示任务完成或成功。
什么是 ANSI 转义序列?
终端(Terminal)是我们与操作系统交互的重要工具,而 ANSI 转义序列(ANSI Escape Sequences)则是控制终端行为的指令集合。
控制终端颜色的 ANSI 转义序列是一串类似这样的字符: "\033[37;44mHello, World!\033[0m",其中:
\033[是 ANSI 转义序列的开始符;\033其实是ESC的八进制 ASCII 码
37是设置前景色为白色的代码;;是颜色码的分隔符;44是设置背景色为蓝色的代码;m是转义序列的结束符;Hello, World!是要输出的文本;\033[0m是恢复默认颜色的转义序列。
对于支持 ANSI 的终端,我们可以通过这些转义序列,改变文本的颜色、背景色等。
常见的颜色码
前景色/文字颜色(Foreground color):
- 30: 黑色(Black)
- 31: 红色(Red)
- 32: 绿色(Green)
- 33: 黄色(Yellow)
- 34: 蓝色(Blue)
- 35: 洋红色(Magenta)
- 36: 青色(Cyan)
- 37: 白色(White)
背景色(Background color):
- 40: 黑色
- 41: 红色
- 42: 绿色
- 43: 黄色
- 44: 蓝色
- 45: 洋红色
- 46: 青色
- 47: 白色
Python 实例
在 Python 中,我们可以使用 ANSI 转义序列不依赖于任何第三方库轻松实现输出彩色文本。
基本用法
print('默认颜色')
print('\033[;m默认颜色\033[0m') # 分号 ; 是可选的
print('\033[31m红色文本\033[0m')
print('\033[33m黄色文本\033[0m')
print('\033[32m绿色文本\033[0m')
print('\033[37;44m蓝底白字\033[0m')
print('\033[30;47m白底黑字\033[0m')
封装成函数
FG_CODE = {
'black': '30',
'red': '31',
'green': '32',
'yellow': '33',
'blue': '34',
'magenta': '35',
'cyan': '36',
'white': '37',
}
BG_CODE = {
'black': '40',
'red': '41',
'green': '42',
'yellow': '43',
'blue': '44',
'magenta': '45',
'cyan': '46',
'white': '47',
}
def color_print(text: str, fg: str = None, bg: str = None):
fg = FG_CODE.get(fg) or ''
bg = BG_CODE.get(bg) or ''
print(f'\033[{fg};{bg}m{text}\033[0m')
color_print('默认颜色')
color_print('红色文本', fg='red')
color_print('黄色文本', fg='yellow')
color_print('绿色文本', fg='green')
color_print('蓝底白字', fg='white', bg='blue')
color_print('白底黑字', fg='black', bg='white')
输出:

高级用法:彩色日志
class Logger:
CODE = {
"debug": '32', # green
"info": '37', # white
"warning": '33', # yellow
"error": '31' # red
}
def debug(self, msg):
c = self.CODE.get('debug')
print(f'\033[{c}m{msg}\033[0m')
def info(self, msg):
c = self.CODE.get('info')
print(f'\033[{c}m{msg}\033[0m')
def warnging(self, msg):
c = self.CODE.get('warning')
print(f'\033[{c}m{msg}\033[0m')
def error(self, msg):
c = self.CODE.get('error')
print(f'\033[{c}m{msg}\033[0m')
if __name__ == '__main__':
logger = Logger()
logger.debug('这是 DEBUG 信息')
logger.info('这是日志信息')
logger.warnging('这是警告信息')
logger.error('这是错误信息')
输出:

其他语言实例
在其他语言中,我们也可以使用 ANSI 转义序列实现彩色输出。
C 语言
#include <stdio.h>
#include <stdlib.h>
void set_color(int bg, int fg) {
printf("\033[%d;%dm", bg, fg);
}
void reset_color() {
printf("\033[0m");
}
int main() {
printf("\033[44;37m蓝底白字!\033[0m\n");
printf("\033[45;37m"); // 设置颜色
printf("背景色为洋红色,前景色为白色\n");
printf("\033[0m"); // 恢复默认颜色
set_color(44, 37); // 设置颜色
printf("背景色为蓝色,前景色为白色\n");
reset_color(); // 恢复默认颜色
set_color(40, 32);
printf("背景色为黑色,前景色为绿色\n");
reset_color();
return 0;
}
输出:

总结
- 对于简单的颜色处理, 我们可以使用 ANSI 转义序列,不需要安装任何第三方库。
- Python 中如果需要丰富的功能,推荐使用 rich。
rich是一个功能强大的 Python 库,用于在终端中生成精美的输出。它支持彩色文本、表格、进度条、标记(markup)、树形结构等多种高级格式化输出。使用 rich 可以让命令行应用程序的输出更加直观和美观。rich还支持漂亮的日志记录输出,可以替代标准的日志库。
4607

被折叠的 条评论
为什么被折叠?



