Python 间距和对齐字符串

Posted

技术标签:

【中文标题】Python 间距和对齐字符串【英文标题】:Python spacing and aligning strings 【发布时间】:2012-05-24 07:43:36 【问题描述】:

我正在尝试添加间距以对齐两个字符串 var 之间的文本,而不使用 " " 这样做

试图让文本看起来像这样,第二列对齐。

Location: 10-10-10-10       Revision: 1
District: Tower             Date: May 16, 2012
User: LOD                   Time: 10:15

目前有这样的编码,只是使用空格...

"Location: " + Location + "               Revision: " + Revision + '\n'

我尝试使用 string.rjustsrting.ljust 但无济于事。

建议?

【问题讨论】:

string.ljust 应该做你想做的事。你能把你在 .ljust 舞台上的尝试发布吗? 另见***.com/questions/1448820/… 【参考方案1】:

从 Python 3.6 开始,我们有一个更好的选择,f-strings!

print(f"'Location: ' + location:<25 Revision: revision")
print(f"'District: ' + district:<25 Date: date")
print(f"'User: ' + user:<25 Time: time")

输出:

Location: 10-10-10-10     Revision: 1
District: Tower           Date: May 16, 2012
User: LOD                 Time: 10:15

由于大括号内的所有内容都是在运行时计算的,我们可以输入字符串'Location: ' 和变量location 连接。使用:&lt;25 将整个连接的字符串放入一个25 个字符长的框中,&lt; 表示您希望它左对齐。这样,第二列总是在为第一列保留的 25 个字符之后开始。

这里的另一个好处是您不必计算格式字符串中的字符数。使用 25 将适用于所有这些,前提是 25 的长度足以包含左列中的所有字符。

https://realpython.com/python-f-strings/ 解释了 f 弦相对于以前的选项的好处。 https://medium.com/@NirantK/best-of-python3-6-f-strings-41f9154983e 解释了如何使用 和 ^ 进行左对齐、右对齐和居中对齐。

【讨论】:

IMO 这是最好的答案。正是我需要的! 恕我直言,这是最简单的形式。谢谢!【参考方案2】:

您可以使用expandtabs 指定制表位,如下所示:

print(('Location: ' + '10-10-10-10' + '\t' + 'Revision: 1').expandtabs(30))
print(('District: Tower' + '\t' + 'Date: May 16, 2012').expandtabs(30))

输出:

Location: 10-10-10-10         Revision: 1
District: Tower               Date: May 16, 2012

【讨论】:

@Frerich FYI,我不得不基本上回滚您的编辑,因为它破坏了这个答案,因为标签实际上没有展开。括号需要围绕字符串,因为属性''.expandtabs 比串联'' + '' 绑定更紧密。我认为您的困惑是代码是为 Python 3(其中 print() 是一个函数)编写的,而实际上它是为 Python 2(其中 print 是一个语句)编写的。【参考方案3】:

你应该可以使用格式化方法:

"Location: 0:20 Revision 1".format(Location, Revision)

您必须根据标签的长度计算出每行的格式长度。 User 行需要比LocationDistrict 行更宽的格式宽度。

【讨论】:

请参阅 docs.python.org/library/string.html#formatspec 以帮助了解 format 命令的工作原理。 但这并不容易,因为程序员必须计算格式字符串中的字符数。 @Arthur 更好的选择是提前组合它们,比如label = 'Location'; labelled = '0: 1'.format(label, Location); '0:30'.format(labelled)【参考方案4】:

复活另一个话题,但这对某些人来说可能会派上用场。

从https://pyformat.info 获得一点灵感,您可以构建一种方法来获取目录 [TOC] 样式的打印输出。

# Define parameters
Location = '10-10-10-10'
Revision = 1
District = 'Tower'
MyDate = 'May 16, 2012'
MyUser = 'LOD'
MyTime = '10:15'

# This is just one way to arrange the data
data = [
    ['Location: '+Location, 'Revision:'+str(Revision)],
    ['District: '+District, 'Date: '+MyDate],
    ['User: '+MyUser,'Time: '+MyTime]
]

# The 'Table of Content' [TOC] style print function
def print_table_line(key,val,space_char,val_loc):
    # key:        This would be the TOC item equivalent
    # val:        This would be the TOC page number equivalent
    # space_char: This is the spacing character between key and val (often a dot for a TOC), must be >= 5
    # val_loc:    This is the location in the string where the first character of val would be located

    val_loc = max(5,val_loc)

    if (val_loc <= len(key)):
        # if val_loc is within the space of key, truncate key and
        cut_str =  ':.'+str(val_loc-4)+''
        key = cut_str.format(key)+'...'+space_char

    space_str = ':'+space_char+'>'+str(val_loc-len(key)+len(str(val)))+''
    print(key+space_str.format(str(val)))

# Examples
for d in data:
    print_table_line(d[0],d[1],' ',30)

print('\n')
for d in data:
    print_table_line(d[0],d[1],'_',25)

print('\n')
for d in data:
    print_table_line(d[0],d[1],' ',20)

结果输出如下:

Location: 10-10-10-10         Revision:1
District: Tower               Date: May 16, 2012
User: LOD                     Time: 10:15


Location: 10-10-10-10____Revision:1
District: Tower__________Date: May 16, 2012
User: LOD________________Time: 10:15


Location: 10-10-... Revision:1
District: Tower     Date: May 16, 2012
User: LOD           Time: 10:15

【讨论】:

【参考方案5】:

@IronMensan 的格式方法答案是要走的路。但为了回答您关于 ljust 的问题:

>>> def printit():
...     print 'Location: 10-10-10-10'.ljust(40) + 'Revision: 1'
...     print 'District: Tower'.ljust(40) + 'Date: May 16, 2012'
...     print 'User: LOD'.ljust(40) + 'Time: 10:15'
...
>>> printit()
Location: 10-10-10-10                   Revision: 1
District: Tower                         Date: May 16, 2012
User: LOD                               Time: 10:15

编辑注意这个方法不需要你知道你的字符串有多长。 .format() 也可以,但我对它还不够熟悉。

>>> uname='LOD'
>>> 'User: '.format(uname).ljust(40) + 'Time: 10:15'
'User: LOD                               Time: 10:15'
>>> uname='Tiddlywinks'
>>> 'User: '.format(uname).ljust(40) + 'Time: 10:15'
'User: Tiddlywinks                       Time: 10:15'

【讨论】:

【参考方案6】:

尝试%*s%-*s 并在每个字符串前面加上列宽:

>>> print "Location: %-*s  Revision: %s" % (20,"10-10-10-10","1")
Location: 10-10-10-10           Revision: 1
>>> print "District: %-*s  Date: %s" % (20,"Tower","May 16, 2012")
District: Tower                 Date: May 16, 2012

【讨论】:

希望我能给你更多的支持。整洁的解决方案,不知道字符串格式化中的“*”运算符 这非常接近我想要做的。唯一剩下的就是,如果 District 更改为“DOE”,那么这些列仍将位于与以前相同的位置。有没有办法在列对齐之前始终设置一定的距离,比如 20 个字符,这与第一列中值的长度无关? 是的,只是把它当作另一列:"%-9s %-20s %-9s %-20s"%("Location:","10-10-10-10", "Revision:", "1") 但是如果你使用的是 python 2.6 或更高版本,请使用@IronMensan 的格式化方法。 对,列宽,这里是20,当然可以是Python变量。如果有很多行被格式化,可以编写一个函数或方法来获取列宽和文本,并使用这种方法来格式化行。

以上是关于Python 间距和对齐字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用间距、制表符或填充对齐列中的内容?

[Python]中英文混合字符串的对齐

idea 中文标点不对齐,怎么设置

字间距怎么调?

word公式样式

text-align: justify两端对齐布局