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.rjust
和 srting.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
连接。使用:<25
将整个连接的字符串放入一个25 个字符长的框中,<
表示您希望它左对齐。这样,第二列总是在为第一列保留的 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
行需要比Location
或District
行更宽的格式宽度。
【讨论】:
请参阅 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 间距和对齐字符串的主要内容,如果未能解决你的问题,请参考以下文章