Окрашивание вывода терминала с помощью ANSI escape-кодов в программах на Python
Цвет текста в консоли 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}")
Яркий красный Зелёный текст на жёлтом фоне Приглушённый циан на пурпурном