Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python’;s`str.format()`、填充字符和ANSI颜色_Python_String_Terminal_Ansi Colors - Fatal编程技术网

Python’;s`str.format()`、填充字符和ANSI颜色

Python’;s`str.format()`、填充字符和ANSI颜色,python,string,terminal,ansi-colors,Python,String,Terminal,Ansi Colors,在Python2中,我使用str.format()将要打印的一组文本列对齐到终端。基本上,它是一个表,但我不打印任何边框或任何东西,它只是一行行文本,对齐成列 没有色彩的摆弄,一切都按预期打印 如果我用ANSI颜色代码包装整行(即一个print语句),则所有内容都会按预期进行打印 但是:如果我试图使一行中的每一列都有不同的颜色,对齐就会被取消。从技术上讲,路线保持不变;是填充字符(空格)未按要求打印;事实上,填充字符似乎已完全删除 我已经用和验证了相同的问题。结果是一样的。因此,我确信这个问

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

  • 没有色彩的摆弄,一切都按预期打印
  • 如果我用ANSI颜色代码包装整行(即一个
    print
    语句),则所有内容都会按预期进行打印
  • 但是:如果我试图使一行中的每一列都有不同的颜色,对齐就会被取消。从技术上讲,路线保持不变;是填充字符(空格)未按要求打印;事实上,填充字符似乎已完全删除
我已经用和验证了相同的问题。结果是一样的。因此,我确信这个问题与<>代码> STR.Falm()/<代码>在字符串的中间不能很好地使用ANSI转义序列。

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

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


帮个小忙?☺

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()不需要”更具体的东西,你需要向我们展示(部分)你的代码