79

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

 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
4

8 回答 8

127

您可以在大小要求前加上-左对齐:

sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))
于 2012-10-02T04:08:41.627 回答
50

此版本使用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中删除。

于 2012-10-02T04:24:49.530 回答
29
sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))

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

>>> d = "%-*s%-*s"%(25,"apple",30,"something")
>>> d
'apple                    something                     '
于 2012-10-02T04:05:08.727 回答
23

我绝对更喜欢该format方法,因为它非常灵活,可以通过定义__format__orstrrepr表示轻松地扩展到您的自定义类。为了简单起见,我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.........'

高级示例

如果您有自定义类,则可以按如下方式定义它str或表示:repr

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

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

现在您可以使用!s(str) 或!r(repr) 告诉 python 调用那些定义的方法。如果没有定义,Python 默认 __format__也可以被覆盖。x = 富()

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

资料来源:Python Essential Reference,David M. Beazley,第 4 版

于 2017-12-12T22:44:42.160 回答
22

使用Python 3.6中新的和流行的f 字符串,我们是这样左对齐的,比如一个具有 16 个填充长度的字符串:

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

如果您有可变填充长度:

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

f弦更紧凑。

于 2019-02-09T09:45:09.670 回答
9

使用-50%而不是+50%它们将左对齐..

于 2012-10-02T04:06:41.223 回答
6

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

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

(另请注意,+在现代 Python 中,字符串添加 with 比过去快得多,但如果您仍然出于习惯更喜欢该方法,您可以换掉+with )''.join(...)

于 2013-05-10T07:39:47.450 回答
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])
于 2013-11-12T17:14:02.477 回答