Python在字符串格式宽度字段中计数零长度控制字符?

Python在字符串格式宽度字段中计数零长度控制字符?,python,terminal,printf,Python,Terminal,Printf,在Python3.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(str

在Python3.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))
这将输出:

foo12  bar
foo12bar
(第二个输出的“12”是红色的,但我不能用这样的方式重现)

在第二种情况下,我丢失了字段宽度,我假设是因为Python看到字符串中的字符总数大于宽度,尽管大多数字符导致符合ANSI标准的终端上的长度为零

使用ANSI颜色和工作区宽度的干净方法是什么

使用ANSI颜色和工作区宽度的干净方法是什么

不幸的是,您将不得不剥离转义序列以获得显示的字段宽度

函数的作用是:返回Python 2 str类型中的字节数和Python 3 str类型中的代码点数。该长度从未保证与显示宽度匹配(这是一个更具挑战性的问题):


一般来说,除非您知道显示器将如何解释代码,否则无法确定显示器的宽度(即,宽度不同,取决于设备是否支持ANSI转义序列)。

我不知道它是否符合“干净”的条件,但以下几点是可行的:

print("foo{0}{1:4s}{2}bar".format(ANSI_RED, string1, ANSI_DEFAULT))

正确获取终端控制代码非常困难(如下所示,并非所有代码都具有定义良好的宽度),因此最好的选择可能是使用显式列移动

# string2 defined as above
def col(n): return "\033[{:d}G".format(n)
print("foo{:s}{:s}bar".format(string2,col(8)))
输出:

foo12  bar

也许能帮上忙,哎呀!我的第一反应是,如果我要去那里,不妨拿出一个完整的ncurseslibrary@john当前位置我也想建议:-)但是列对齐就是列对齐,不是吗?写cols(宽度、字符串)相对容易。谢谢!我担心事情会发展到这个地步,但权威的声音说:“我没想到!不幸的是,生成的字符串本身被用作更多格式的输入,因此我要么需要在构建它时跟踪显示长度,要么像Raymond建议的那样,只需去除转义即可进行计算。这是我在shell脚本中倾向于做的事,然后使用诸如
success($msg)
之类的函数打印绿色和
warn($msg)
打印为黄色的。它增加了一些语义。
foo12  bar