Ул. `в Python.format ()', символы заливки и цвета ANSI

в Python 2, я использую str.format() чтобы выровнять кучу столбцов текста, который я печатаю на терминал. В принципе, это таблица, но я не печатаю никаких границ или что-то еще-это просто строки текста, выровненные по столбцам.

  • без цветной скрипки все печатается так, как ожидалось.
  • если я оберну всю строку (т. е. один print оператор) с цветовыми кодами ANSI все печатается так, как ожидалось.
  • однако: если я попытаюсь сделать каждый столбец другого цвета в строке, выравнивание сбрасывается. Технически,трассы - это заливка символов (пробелы), которые не печатаются по желанию; на самом деле символы заполнения, похоже, полностью удалены.

Я проверил ту же проблему с обоими colorama и xtermcolor. Результаты были те же. Поэтому я уверен, что проблема связана с str.format() не играю ну, с escape-последовательностями ANSI в середине строки.

но я не знаю, что делать! :( Я действительно хотел бы знать, если есть какой-либо обходной путь для этой проблемы.

цвет и выравнивание мощные инструменты для улучшать считываемость, и считываемость важная часть практичности программного обеспечения. Для меня было бы очень важно, если бы это можно было сделать без ручного выравнивания каждого столбца текста.

поможешь? ☺

2 ответов


Python не различает "обычные" символы и цветовые коды ANSI, которые также являются символами, интерпретируемыми терминалом.

другими словами, печати '\x1b[92m' чтобы терминал мог изменить цвет текста терминала, Python не видит в этом ничего, кроме набора из 5 символов. Если вы используете print repr(line) вместо этого python будет печатать строковую литеральную форму, включая использование escape-кодов для не-ASCII печатаемых символов (поэтому код ESC ASCII, 27, отображается как \x1b), чтобы увидеть, сколько было добавлено.

вам нужно будет настроить выравнивание столбцов вручную, чтобы разрешить эти дополнительные символы.

без вашего фактического кода, это трудно для нас, чтобы помочь вам, хотя.


это очень поздний ответ, оставленный как хлебные крошки для тех, кто находит эту страницу, пытаясь отформатировать текст со встроенными цветовыми кодами ANSI.

комментарий byoungb о принятии решений о заполнении по длине предварительно раскрашенного текста совершенно правильно. Но если у вас уже есть цветной текст, вот обходной путь:

посмотреть мои ansiwrap модуль на PyPI. Его основная цель-обеспечение textwrap для текста цвета ANSI, но также экспорт ansilen(), который говорит вам "как долго будет эта строка, если это не содержат коды управления ANSI?"Это очень полезно при форматировании, ширине столбца и обертывании решений на предварительно окрашенном тексте. Добавить width - ansilen(s) пробелы до конца или начала s влево (или, соответственно, справа) оправдать s в столбце нужный width. Например:

def ansi_ljust(s, width):
    needed = width - ansilen(s)
    if needed > 0:
        return s + ' ' * needed
    else:
        return s

кроме того, если вам нужно разделить, усечь или объединить цветной текст в какой-то момент, вы обнаружите, что Статная натура Анси делает это рутиной. Вы можете найти ansi_terminate_lines() полезно; он "исправляет" список подстрок, чтобы каждый из них имел независимые, самостоятельные коды ANSI с эквивалентным эффектом в качестве исходной строки.

последние версии ansicolors также содержат эквивалентную реализацию ansilen().