Python’;s`str.format()`、填充字符和ANSI颜色
在Python2中,我使用Python’;s`str.format()`、填充字符和ANSI颜色,python,string,terminal,ansi-colors,Python,String,Terminal,Ansi Colors,在Python2中,我使用str.format()将要打印的一组文本列对齐到终端。基本上,它是一个表,但我不打印任何边框或任何东西,它只是一行行文本,对齐成列 没有色彩的摆弄,一切都按预期打印 如果我用ANSI颜色代码包装整行(即一个print语句),则所有内容都会按预期进行打印 但是:如果我试图使一行中的每一列都有不同的颜色,对齐就会被取消。从技术上讲,路线保持不变;是填充字符(空格)未按要求打印;事实上,填充字符似乎已完全删除 我已经用和验证了相同的问题。结果是一样的。因此,我确信这个问
str.format()
将要打印的一组文本列对齐到终端。基本上,它是一个表,但我不打印任何边框或任何东西,它只是一行行文本,对齐成列
- 没有色彩的摆弄,一切都按预期打印
- 如果我用ANSI颜色代码包装整行(即一个
语句),则所有内容都会按预期进行打印print
- 但是:如果我试图使一行中的每一列都有不同的颜色,对齐就会被取消。从技术上讲,路线保持不变;是填充字符(空格)未按要求打印;事实上,填充字符似乎已完全删除
帮个小忙?☺ Python不区分“普通”字符和ANSI颜色代码,后者也是终端解释的字符 换句话说,将
'\x1b[92m'
打印到终端可能会改变终端文本的颜色,Python只将其视为一组5个字符。如果改用print repr(line)
,Python将打印字符串文本形式,包括对非ASCII可打印字符使用转义码(因此ESC ASCII代码27显示为\x1b
)以查看添加了多少
您需要手动调整列对齐方式以允许这些额外字符
如果没有实际的代码,我们很难帮助您。Python不区分“普通”字符和ANSI颜色代码,它们也是终端解释的字符 换句话说,将
'\x1b[92m'
打印到终端可能会改变终端文本的颜色,Python只将其视为一组5个字符。如果改用print repr(line)
,Python将打印字符串文本形式,包括对非ASCII可打印字符使用转义码(因此ESC ASCII代码27显示为\x1b
)以查看添加了多少
您需要手动调整列对齐方式以允许这些额外字符
如果没有您的实际代码,我们很难帮助您。这是一个非常晚的答案,对于那些在努力使用内置ANSI颜色代码格式化文本时发现此页面的人来说,这只是面包屑 关于对预着色文本的长度进行填充的决定是完全正确的。但是,如果您已经有彩色文本,这里有一个解决方法: 请参阅PyPI上的我的模块。它的主要目的是为ANSI彩色文本提供
textwrap
,但它也导出ansilen()
,它告诉您“如果这个字符串不包含ANSI控制代码,它会有多长?”在对预着色文本进行格式化、列宽和换行决策时,它非常有用。在s
的结尾或开头添加s
空格,向左(或分别向右)在所需宽度的列中对齐s
。例如:
def ansi_ljust(s, width):
needed = width - ansilen(s)
if needed > 0:
return s + ' ' * needed
else:
return s
此外,如果您需要在某个时刻拆分、截断或合并彩色文本,您会发现ANSI的状态特性使这成为一件麻烦事。您可能会发现ANSI\u terminate\u lines()
很有帮助;它“修补”了子字符串列表,以便每个子字符串都有独立的、独立的ANSI代码,其效果与原始字符串相同
最新版本的还包含一个等效的实现ansilen()
这是一个非常晚的答案,对于那些在努力使用内置ANSI颜色代码格式化文本时发现此页面的人来说,这是一个面包屑
关于对预着色文本的长度进行填充的决定是完全正确的。但是,如果您已经有彩色文本,这里有一个解决方法:
请参阅PyPI上的我的模块。它的主要目的是为ANSI彩色文本提供textwrap
,但它也导出ansilen()
,它告诉您“如果这个字符串不包含ANSI控制代码,它会有多长?”在对预着色文本进行格式化、列宽和换行决策时,它非常有用。在s
的结尾或开头添加s
空格,向左(或分别向右)在所需宽度的列中对齐s
。例如:
def ansi_ljust(s, width):
needed = width - ansilen(s)
if needed > 0:
return s + ' ' * needed
else:
return s
此外,如果您需要在某个时刻拆分、截断或合并彩色文本,您会发现ANSI的状态特性使这成为一件麻烦事。您可能会发现ANSI\u terminate\u lines()
很有帮助;它“修补”了子字符串列表,以便每个子字符串都有独立的、独立的ANSI代码,其效果与原始字符串相同
最新版本的还包含一个等效的实现ansilen()
,如果您想要比“Python.format()不处理任何不同的ANSI转义字符”更具体的内容,您需要向我们展示(部分)您的代码。我理解没有代码本身的帮助很难。对此我很抱歉。不过,我希望得到下面发布的@MartijnPieters这样的答案。如果我对此运气不好,我会继续发布代码。另外,如果你想要比“Python.format()不需要”更具体的东西,你需要向我们展示(部分)你的代码