使用 ANSI 转义序列输出彩色文本

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

我们编程时所使用的文本编辑器(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 还支持漂亮的日志记录输出,可以替代标准的日志库。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值