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

时间:2012-10-02 04:03:09

标签: python string-formatting

我只想要固定宽度的文字列,但字符串都是右边填充,而不是左边!!?

 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

8 个答案:

答案 0 :(得分:102)

您可以使用-为大小要求添加前缀左对齐:

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

答案 1 :(得分:41)

此版本使用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))

<强>更新

之前在文档中有一条关于将来会从该语言中删除%运算符的声明。该声明为removed from the docs

答案 2 :(得分:25)

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

在旁注上,您可以使用*-s

创建宽度变量
>>> d = "%-*s%-*s"%(25,"apple",30,"something")
>>> d
'apple                    something                     '

答案 3 :(得分:9)

使用-50%代替+50%他们将与左边对齐..

答案 4 :(得分:7)

我绝对更喜欢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 Essential Reference,David M. Beazley,第4版

答案 5 :(得分: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])

答案 6 :(得分:4)

使用 Python 3.6 中新的流行的 f-strings ,这是我们将具有16个填充长度的字符串左对齐的方法:

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

如果填充长度可变:

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

f字符串更具可读性。

答案 7 :(得分:3)

稍微更易读的替代解决方案:
sys.stdout.write(code.ljust(5) + name.ljust(20) + industry)

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