2012-06-28 75 views
6

我很难让python打印出正确对齐的文本。我已经尝试了我所知道的一切,但仍然是相同的结果,这是非常烦人的!格式化控制台输出

以下是我在控制台 enter image description here

这里我得到是我的代码。

print " FileName\t\t\t\t\tStatus\t\tBinary Type\n" 

for files in PASS: 
    log = subprocess.check_output(['dumpbin','/HEADERS',files]) 
    if arch64 in log: 
     print" %s \t\t\t\tPASSED\t\t 64-bit \t\t " %files 
    elif arch32 in log: 
     print" %s \t\t\t\tPASSED\t\t 32-bit \t\t " %files 
print"\n" 
for files in FAILED: 

    print" %s \t\t\t\t FAILED \t\t  " %files 

print "\n\n 

回答

11

使用%45s来制作45个字符长的右对齐字段。并使用%-45s来制作一个左对齐的字符串。另外考虑将你的行打印提取到一个函数中 - 这样你就可以在一个地方轻松地进行修改。像这样:

# fake setup 
PASS = ["foo.exe", "bar.exe", "really_long_filename.exe"] 
FAILED = ["failed.exe"] 
types = ["32-bit", "64-bit", "64-bit"] 
arch64 = '64' 
arch32 = '32' 

# your code 
def print_row(filename, status, file_type): 
    print " %-45s %-15s %15s" % (filename, status, file_type) 

print_row('FileName', 'Status', 'Binary Type') 

for files in PASS: 
    log = types.pop() 
    if arch64 in log: 
     print_row(files, 'PASSED', '64-bit') 
    elif arch32 in log: 
     print_row(files, 'PASSED', '32-bit') 
print"\n" 

for files in FAILED: 
     print_row(files, 'FAILED', '') 

print "\n\n" 
+0

谢谢你,这个伟大工程:),我可以问你为什么要使用'type'作为函数参数之一? – cyberbemon

+1

erm ...应该是binary_type或其他... type是一个不错的选择名称,因为它已经是python中的一个函数了...它仍然可以工作,但不是一个好的风格...所以我修复了它up above :) –

+1

或者['str.ljust'](简称http://docs.python.org/library/stdtypes.html#str.rjust) –

4

取代选项卡,最好使用字符串格式指令,可以指定空格的确切数量并为输出进行保留。

例如

print '>>%20s<<' %('some string') 
>>   some string<< 

将预留20个车位和 -align这个字符串显示。您可以使用%-20s

print '>>%-20s<<' %('some string') 
>>some string   << 

数字可以使用d的整数和f浮点值指定离开 -justify它。例如,

print '%03d %5.2f' %(5, 22/7.0) 
005 3.14 

在这个例子中我保留3的整数值零填充的空间,和5位为(小数点后空间2的值)的浮子。您也可以在这里使用-来控制对齐。还有许多其他选项可用于格式化输出,请参阅下面的建议链接了解更多详细信息。

请注意,鼓励使用.format()功能。请参阅我的answer here关于如何使用.format()。这answer也可能有所帮助。

虽然.format看起来很冗长,但确实提供了很大的灵活性,我最喜欢的功能之一是能够轻松打印大量的逗号以提高可读性。

Python docs on String Formatting为更多的细节来帮助你排队的输出只是正是你喜欢的方式。

2

如果您使用字符串格式与padding,例如,您可以简化它很多。

>>> '%20s' % 'test' 
'    test' 
>>> '%-20s' % 'test' 
'test    ' 
0

您可以使用第三方模块将输出格式化为控制台。

即: texttable

2

我建议使用ljust与他们一样

print files.ljust(20) + 'Passed'.ljust(5) + '64-bit' 

,而不是一些这方面的事情:

print" %s \t\t\t\tPASSED\t\t 64-bit \t\t " %files