Окрашивание вывода терминала с помощью ANSI escape-кодов в программах на Python

Раздел: Работа со строками -> ANSI-коды цвета

Цвет текста в консоли Python с помощью ANSI-кодов

Наиболее эффективный способ управления цветом текста в консоли - использование ANSI escape-последовательностей. Они представляют собой управляющие символы, начинающиеся с \033[ (или \x1b[) и заканчивающиеся буквой m. Число между скобками и буквой определяет стиль, цвет текста (30–37) или фона (40–47).

Для удобства создают константы или класс:


class Colors:
    RESET = '\033[0m'
    RED = '\033[31m'
    GREEN = '\033[32m'
    YELLOW = '\033[33m'
    BLUE = '\033[34m'
    MAGENTA = '\033[35m'
    CYAN = '\033[36m'
    WHITE = '\033[37m'

print(f"{Colors.RED}Это красный текст{Colors.RESET}")
print(f"{Colors.GREEN}Зелёный{Colors.RESET}")

цвет текста python (цвет текста в консоли python)

Это красный текст (в консоли красный)
Зелёный (в консоли зелёный)

Принцип работы: последовательность \033[31m включает красный цвет, а \033[0m полностью сбрасывает все стили. Без сброса последующий текст также будет окрашен.

Как вывести одну строку с цветом без создания класса?

Можно вставить код прямо в строку:


print('\033[31mКрасный текст\033[0m')
print('\033[32;1mЖирный зелёный\033[0m')

Код 32;1 означает зелёный (32) с яркостью (1, bold). Точка с запятой разделяет атрибуты.

Как удобно хранить набор цветов для многократного использования?


colors = {
    'reset': '\033[0m',
    'red': '\033[31m',
    'green': '\033[32m',
    'yellow': '\033[33m',
    'blue': '\033[34m'
}
print(f"{colors['red']}Важное сообщение{colors['reset']}")

Словарь позволяет выбирать цвет по имени. Удобно использовать в циклах.

Как сделать цвета доступными в Windows (cmd, PowerShell)?

В старых версиях Windows консоль не поддерживает ANSI-коды по умолчанию. Библиотека colorama решает проблему:


# Установка: pip install colorama
from colorama import init, Fore, Back, Style

init(autoreset=True)  # Автоматический сброс после каждого print

print(f"{Fore.RED}Это красный{Style.RESET_ALL}")
print(f"{Fore.GREEN}{Back.YELLOW}Зелёный на жёлтом{Style.RESET_ALL}")

autoreset=True избавляет от необходимости добавлять сброс вручную.

Как упростить работу с цветами с помощью библиотеки termcolor?


# Установка: pip install termcolor
from termcolor import colored

print(colored('Текст красный', 'red'))
print(colored('Зелёный на сером фоне', 'green', 'on_grey'))
print(colored('Жирный и синий', 'blue', attrs=['bold']))

Функция colored принимает цвет текста, цвет фона (с префиксом on_) и список атрибутов.

Типичные проблемы и их решения

1. Цвет остаётся на весь последующий вывод - забыли указать сброс. Решение: всегда добавлять \033[0m или использовать colorama с autoreset=True.

2. В Windows цвета не отображаются, вместо них видны символы - консоль не поддерживает ANSI. Решение: установить colorama и вызвать init().

3. Путаница с кодами фона - цвета фона имеют коды 40–47, а текста 30–37. Неверно: \033[31m (красный текст), а для фона нужно \033[41m.

4. Экранирование обратной косой черты - если код записан в обычной строке, Python интерпретирует \033 как escape-последовательность. Если используется raw-строка (r'\033[31m'), символы не обрабатываются, и код не сработает. Правильно: либо обычная строка с \033, либо избежать raw.

Расширенные примеры работы с ANSI-кодами в Python

Пример 1: Радуга из букв с использованием цикла

Пример

rainbow_colors = [31, 33, 32, 36, 34, 35]  # красный, жёлтый, зелёный, циан, синий, пурпурный
line = "Радуга"
for i, ch in enumerate(line):
    code = rainbow_colors[i % len(rainbow_colors)]
    print(f"\033[{code}m{ch}\033[0m", end="")
print()
(каждая буква выводится своим цветом)

Пример 2: Использование фона и текста одновременно

Пример

print(f"\033[41m\033[37mБелый текст на красном фоне\033[0m")
print(f"\033[42m\033[30mЧёрный текст на зелёном фоне\033[0m")
Белый текст на красном фоне (в консоли)
Чёрный текст на зелёном фоне (в консоли)

Пример 3: 256 цветов (расширенная палитра)

Пример

# Код 38;5;N - цвет текста, N от 0 до 255
print("Палитра 256 цветов:")
for i in range(0, 256, 16):
    for j in range(16):
        if i + j < 256:
            code = 38;5;{i+j}
            print(f"\033[{code}m {i+j:03d} \033[0m", end="")
    print()
Палитра 256 цветов:
000 001 002 ... 015
016 017 ... 031
...
240 241 ... 255
(каждая группа отображается своим цветом)

Пример 4: Комбинация стилей (bold, underline, reverse)

Пример

print("\033[1;4;33mЖирный, подчёркнутый, жёлтый\033[0m")
print("\033[1;7;32mЖирный, инвертированный, зелёный\033[0m")
print("\033[5;31mМигающий красный (может не работать во всех терминалах)\033[0m")
Жирный, подчёркнутый, жёлтый
Жирный, инвертированный, зелёный
Мигающий красный (мигание видно не везде)

Пример 5: Создание собственного класса с методами для сложного форматирования

Пример

class Style:
    @staticmethod
    def color(text, fg=None, bg=None, bold=False, underline=False):
        codes = []
        if bold:
            codes.append('1')
        if underline:
            codes.append('4')
        if fg:
            codes.append(str(30 + fg))
        if bg:
            codes.append(str(40 + bg))
        code_str = ';'.join(codes)
        return f"\033[{code_str}m{text}\033[0m"

# Цвета: 0=чёрный, 1=красный, 2=зелёный, 3=жёлтый, 4=синий, 5=пурпурный, 6=циан, 7=белый
print(Style.color("Жирный красный", fg=1, bold=True))
print(Style.color("Зелёный на синем фоне", fg=2, bg=4))
Жирный красный (выделено жирным, красный)
Зелёный на синем фоне

Пример 6: Прогресс-бар с цветом

Пример

import time

def progress_bar(iterable, total, prefix='', suffix='', length=40, fill='█'):
    """Отображение прогресс-бара с цветом"""
    for i, item in enumerate(iterable, 1):
        percent = i / total
        filled = int(length * percent)
        bar = f"\033[32m{fill * filled}\033[0m{\033[37m{'░' * (length - filled)}\033[0m}"
        print(f'\r{prefix} {bar} {suffix}', end='', flush=True)
        yield item
    print()

for _ in progress_bar(range(100), total=100, prefix='Загрузка:', suffix='Готово!'):
    time.sleep(0.02)
Загрузка: ████████████████████████████████████████░ Готово!
(зелёный заполненный, серый остаток)

Пример 7: Использование colorama с Fore, Back, Style

Пример

from colorama import init, Fore, Back, Style

init(autoreset=True)

print(f"{Fore.RED}{Style.BRIGHT}Яркий красный{Style.RESET_ALL}")
print(f"{Fore.GREEN}{Back.YELLOW}Зелёный текст на жёлтом фоне{Style.RESET_ALL}")
print(f"{Fore.CYAN}{Back.MAGENTA}{Style.DIM}Приглушённый циан на пурпурном{Style.RESET_ALL}")
Яркий красный
Зелёный текст на жёлтом фоне
Приглушённый циан на пурпурном

цвет текста в консоли Python - comments

En
цвет текста python (python)