Formatting console Output

28,235

Solution 1

Use %45s to make a right justified field that is 45 characters long. And use %-45s to make a left justified string. Also consider extracting your line printing into a function - that way you'll be able to change it easily in one place. Like this:

# 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"

Solution 2

In place of the tabs, it's better to use string formatting directives where it's possible to specify the exact number of spaces and to reserve for output.

For instance

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

will reserve 20 spaces and right-align this string for display. You can left-justify it by using %-20s

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

Numbers can be specified using d for integers and f for float values. E.g.,

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

In this example I reserved 3 zero-padded spaces for an integer value, and 5 spaces for a float (2 for values after the decimal space). You can control alignemnt here too with -. There are many other options to format output, see the suggested links below for more details.

Note that the use of the .format() function is encouraged. See SO my answer here about how to use .format(). This answer may also help.

While .format may seem very verbose, it does offer a great deal of flexibility and one of my favorite features is the ability to easily print commas in large numbers for readability.

See Python docs on String Formatting for much more details to help you line up your output just exactly the way you'd like it.

Solution 3

i suggest using ljust with them some thing like

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

instead of this :

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

Solution 4

You can simplify it a lot if you use string formatting with padding, for eg.

>>> '%20s' % 'test'
'                test'
>>> '%-20s' % 'test'
'test                '
Share:
28,235
cyberbemon
Author by

cyberbemon

Updated on July 05, 2022

Comments

  • cyberbemon
    cyberbemon almost 2 years

    I'm having trouble making python print out texts properly aligned. I have tried everything I knew, but still the same result and it's very annoying!.

    Here is what I'm getting in the console enter image description here

    Here is the Code I have.

    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