15

在 Python 2 中,我str.format()用于将正在打印的一堆文本列对齐到终端。基本上,它是一个表格,但我没有打印任何边框或任何东西——它只是文本行,对齐到列中。

  • 没有色彩摆弄,一切都按预期打印。
  • 如果我用 ANSI 颜色代码包装一整行(即一个print语句),一切都会按预期打印。
  • 但是:如果我尝试使每一列在一行中具有不同的颜色,则对齐会被取消。从技术上讲,保持对齐;填充字符(空格)没有按需要打印;实际上,填充字符似乎已被完全删除。

我已经用colorama和验证了同样的问题xtermcolor。结果是一样的。因此,我确信这个问题与str.format()字符串中间的 ANSI 转义序列打得不好有关。

但我不知道该怎么办!:( 我真的很想知道这个问题是否有任何解决方法。

颜色和对齐是提高可读性的有力工具,而可读性是软件可用性的重要组成部分。如果可以在不手动对齐每一列文本的情况下实现这一点,那对我来说意义重大。

一点帮助?☺

4

2 回答 2

10

这是一个非常晚的答案,对于在努力使用内置 ANSI 颜色代码格式化文本时找到此页面的任何人来说,都是面包屑。

byoungb关于对预着色文本的长度做出填充决定的评论是完全正确的。但是,如果您已经有彩色文本,这里有一个解决方法:

在 PyPI 上查看我的ansiwrap模块。它的主要目的是提供textwrapANSI 彩色文本,但它也导出告诉你“如果它包含 ANSI 控制代码ansilen(),这个字符串会多长时间?” 它在对预着色文本进行格式设置、列宽和换行决策方面非常有用。在您想要的. 例如:width - ansilen(s)sswidth

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

此外,如果您需要在某些时候拆分、截断或组合彩色文本,您会发现 ANSI 的有状态特性使这成为一件苦差事。您可能会发现ansi_terminate_lines()有帮助;它“修补”子字符串列表,以便每个子字符串具有独立的、独立的 ANSI 代码,其效果与原始字符串相同。

ansicolors的最新版本还包含ansilen().

于 2017-06-06T23:56:13.637 回答
7

Python 不区分“普通”字符和 ANSI 颜色代码,它们也是终端解释的字符。

换句话说,打印'\x1b[92m'到终端可能会改变终端文本的颜色,Python 只将其视为一组 5 个字符。如果您print repr(line)改为使用,python 将改为打印字符串文字形式,包括对非 ASCII 可打印字符使用转义码(因此 ESC ASCII 码 27 显示为\x1b)以查看添加了多少。

您需要手动调整列对齐方式以允许这些额外字符。

如果没有您的实际代码,我们很难为您提供帮助。

于 2013-01-03T14:25:23.100 回答