如何左对齐固定宽度的字符串?


72

我只想要固定宽度的文本列,但所有字符串都在右侧填充,而不是左侧!

 sys.stdout.write("%6s %50s %25s\n" % (code, name, industry))

产生

BGA                                BEGA CHEESE LIMITED   Food Beverage & Tobacco
BHP                               BHP BILLITON LIMITED                 Materials
BGL                               BIGAIR GROUP LIMITED Telecommunication Services
BGG           BLACKGOLD INTERNATIONAL HOLDINGS LIMITED                    Energy

但是我们想要

BGA BEGA CHEESE LIMITED                                Food Beverage & Tobacco
BHP BHP BILLITON LIMITED                               Materials
BGL BIGAIR GROUP LIMITED                               Telecommunication Services
BGG BLACKGOLD INTERNATIONAL HOLDINGS LIMITED           Energy

we!谢谢...这必须非常简单。嗯,现在有3个同时正确的答案,谁会得到绿色的勾号?
John Mee 2012年

Answers:


124

您可以在尺寸要求前加上-左对齐:

sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))

不错的解决方案。这是最好的解决方案。

如果我的大小/宽度值可变怎么办?
ViFI

@ViFI你可以使用*符号这样'%-*sText'%(3,'A')
Chamod

45

此版本使用str.format方法。

Python 2.7及更高版本

sys.stdout.write("{:<7}{:<51}{:<25}\n".format(code, name, industry))

Python 2.6版本

sys.stdout.write("{0:<7}{1:<51}{2:<25}\n".format(code, name, industry))

更新

以前在文档中有一条声明,指出将来会从该语言中删除%运算符。该声明已从docs中删除


5
我相信不再会淘汰旧样式,我相信:bugs.python.org/issue14123
Matthew Trevor

该问题似乎已被拒绝。第一阶段:承诺/拒绝
马尔Alsabbagh

该状态用于表示“已提交”,这肯定是因为对文档进行了更改。3.2文档中的“旧字符串格式化操作”现在是3.3中的printf样式的字符串格式化。该部分也不再提供可能的弃用警告(实际上说“可能消失”,但从未明确),现在替换为有关“古怪”的警告。它不会消失。
马修·特雷弗

2
您正在看文档的另一部分。 3.3文档中仍然存在“旧字符串格式”部分,该部分位于教程部分而不是库参考中。并且“仍然会保留该旧格式的声明”语句。
Marwan Alsabbagh 2012年

4
@Matthew-虚假信息是旨在误导他人的虚假信息。我怀疑马万有这样的意图。
Nick Chammas 2014年

28
sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))

在侧面说明,您可以使用 *-s

>>> d = "%-*s%-*s"%(25,"apple",30,"something")
>>> d
'apple                    something                     '

17

我绝对更喜欢该format方法,因为它非常灵活,可以通过定义__format__strrepr表示形式轻松扩展到您的自定义类。为了简单起见,我print在以下示例中使用,可以将其替换为sys.stdout.write

简单示例:对齐/填充

#Justify / ALign (left, mid, right)
print("{0:<10}".format("Guido"))    # 'Guido     '
print("{0:>10}".format("Guido"))    # '     Guido'
print("{0:^10}".format("Guido"))    # '  Guido   '

我们可以在align指定的旁边添加^<然后>使用填充字符将空格替换为其他任何字符

print("{0:.^10}".format("Guido"))    #..Guido...

多输入示例:对齐并填充许多输入

print("{0:.<20} {1:.>20} {2:.^20} ".format("Product", "Price", "Sum"))
#'Product............. ...............Price ........Sum.........'

进阶范例

如果您有自定义类,则可以如下定义它strrepr表示形式:

class foo(object):
    def __str__(self):
        return "...::4::.."

    def __repr__(self):
        return "...::12::.."

现在您可以使用!s(str)或!r(repr)告诉python调用那些定义的方法。如果未定义任何内容,则Python默认__format__也可以覆盖该默认值 。x = foo()

print "{0!r:<10}".format(x)    #'...::12::..'
print "{0!s:<10}".format(x)    #'...::4::..'

来源:Python基本参考,David M. Beazley,第4版


14

随着新的和流行的F-字符串的Python 3.6,这里是我们如何左对齐说有16个填充长度的字符串:

string = "Stack Overflow"
print(f"{string:<16}..")
Stack Overflow  ..

如果填充长度可变:

k = 20
print(f"{string:<{k}}..")
Stack Overflow      .. 

F弦更加紧凑。


str是Python内置的,因此将其用作对象名称并不理想。
alichaudry

2
你也可以把方向字符><^等等,作为一个变量,那么之后a="<",你可以使用:f"{string:{a}{k}"
Thruston


5

更具可读性的替代解决方案:
sys.stdout.write(code.ljust(5) + name.ljust(20) + industry)

请注意,它ljust(#ofchars)使用固定宽度的字符,并且不会像其他解决方案一样动态调整。


4

这个工作在我的python脚本中:

print "\t%-5s %-10s %-10s %-10s %-10s %-10s %-20s"  % (thread[0],thread[1],thread[2],thread[3],thread[4],thread[5],thread[6])

1
不知道这会增加与其他事物的区别。线程数组到底是什么?
UpAndAdam
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.