在Python 2中,我str.format()用来对齐我正在打印的一堆文本列到终端.基本上,它是一个表,但我不打印任何边框或任何东西 - 它只是文本行,对齐到列.
print用ANSI颜色代码包装整行(即一个语句),则所有内容都按预期打印.我既验证了同样的问题colorama和xtermcolor.结果是一样的.因此,我确定这个问题str.format()与在字符串中间不能很好地使用ANSI转义序列有关.
但我不知道该怎么办!:(我真的想知道这个问题是否有任何解决方法.
颜色和对齐是提高可读性的强大工具,可读性是软件可用性的重要组成部分.如果可以在不手动对齐每列文本的情况下完成此操作,对我来说意义重大.
帮助不大?☺
在 Python 3.4.3 中,我尝试使用 string.format() 运算符对某些字段进行宽度对齐,它似乎将零长度控制字符与宽度总数进行了计数。示例代码:
ANSI_RED = "\033[31m"
ANSI_DEFAULT="\033[39m\033[49m"
string1 = "12"
string2 = ANSI_RED+"12"+ANSI_DEFAULT
print("foo{:4s}bar".format(string1))
print("foo{:4s}bar".format(string2))
Run Code Online (Sandbox Code Playgroud)
这将输出:
foo12 bar
foo12bar
Run Code Online (Sandbox Code Playgroud)
(第二个输出的“12”为红色,但我无法在 SO 中重现它)
在第二种情况下,我丢失了字段宽度,我假设是因为 Python 看到字符串中的字符总数大于宽度,尽管大多数字符在符合 ANSI 的终端上导致零长度。
拥有 ANSI 颜色和工作字段宽度的干净方法是什么?
我们有:
>>> str
'exit\r\ndrwxr-xr-x 2 root root 0 Jan 1 2000
\x1b[1;34mbin\x1b[0m\r\ndrwxr-xr-x 3 root root
0 Jan 1 2000 \x1b[1;34mlib\x1b[0m\r\ndrwxr-xr-x 10 root
root 0 Jan 1 1970 \x1b[1;34mlocal\x1b[0m\r\ndrwxr-xr-x
2 root root 0 Jan 1 2000 \x1b[1;34msbin\x1b[0m\r\ndrwxr-xr-x
5 root root 0 Jan 1 2000 \x1b[1;34mshare\x1b[0m\r\n# exit\r\n'
>>> print str
exit
drwxr-xr-x 2 root root 0 Jan 1 2000 bin
drwxr-xr-x 3 root root 0 Jan 1 2000 lib
drwxr-xr-x 10 root root 0 Jan 1 1970 local
drwxr-xr-x 2 root root …Run Code Online (Sandbox Code Playgroud)