2012-10-02 31 views
45

我只想固定宽度的文本列,但字符串都填充正确,而不是左!!!如何左对齐固定宽度的字符串?

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 
+0

shweet!谢谢...它必须非常简单。嗯,现在有3个同时正确的答案谁得到绿色的勾号? –

回答

89

您可以-前缀尺寸要求左对齐:

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

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

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

注意,您可以使宽度变与*-s

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

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

+0

例如:'print“%-30s”%(name)'用左缩进打印名称。 – mrsrinivas

36

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

UPDATE

以前有大约%操作的文档一份声明中被删除从语言中未来。此声明已被removed from the docs

+5

旧的风格不再被弃用,我相信:http://bugs.python.org/issue14123 –

+0

看起来这个问题被拒绝。阶段:已提交/已拒绝 –

+0

该状态也被用于指示“已提交”,这肯定是因为对文档所做的更改。 3.2文档中的“旧字符串格式化操作”现在是3.3中的[printf-style String Formatting](http://docs.python.org/py3k/library/stdtypes.html#printf-style-string-formatting) 。 _possible_ deprecation警告 - 它实际上说“_may_可能会离开”,它从来没有确定性 - 现在也不在这一部分,取而代之的是关于它“古怪”的警告。它不会消失。 –

2

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

注意ljust(#ofchars)使用固定宽度的字符和不动态调整像其他的解决方案。在我的python脚本

4

这一个工作:

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

不知道这与其他方面的区别是什么。和什么是线程数组? – UpAndAdam

0

我绝对喜欢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的重要参考,大卫·M·比兹利,第四版

相关问题