Python的`str.格式()`、填充字符和ANSI颜色

2024-04-20 16:05:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python2中,我使用str.format()将要打印的文本列对齐到终端。基本上,这是一个表格,但我不打印任何边框或任何东西,只是一行行文本,对齐成列。在

  • 没有色彩的摆弄,一切都如预期的那样。在
  • 如果我用ANSI颜色代码包装整行(即一条print语句),则所有内容都将按预期打印。在
  • 但是:如果我试图使一行中的每一列都有不同的颜色,对齐将被丢弃。从技术上讲,对齐是保留的;填充字符(空格)没有按要求打印;实际上,填充字符似乎被完全删除了。在

我已经用^{}和{a2}验证了相同的问题。结果是一样的。因此,我确信这个问题与str.format()不能很好地处理字符串中间的ANSI转义序列有关。在

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

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

帮不了什么忙?☺ 在


Tags: 文本format终端颜色字符表格边框ansi
2条回答

这是一个非常晚的答案,留给任何人面包屑谁找到这一页,而挣扎着与内置的ANSI色码文本格式。在

byoungb's comment关于对预着色文本的长度进行填充决策是完全正确的。但如果您已经有彩色文本,这里有一个解决方法:

请参阅PyPI上的ansiwrap模块。它的主要目的是为ANSI彩色文本提供textwrap,但是它还导出ansilen(),它告诉您“如果这个字符串不包含ANSI控制代码,它会有多长?”它在对预着色文本进行格式化、列宽和包装决策时非常有用。将width - ansilen(s)空格添加到s的结尾或开头,向左(或分别向右)对齐s到您想要的width列中。E、 g.:

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()的等效实现。在

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

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

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

如果没有你的实际代码,我们很难帮助你。在

相关问题 更多 >