2012-06-28 13 views
6

Ich habe Probleme, Python auszudrucken Texte richtig ausgerichtet. Ich habe alles versucht, was ich wusste, aber immer noch das gleiche Ergebnis und es ist sehr nervig!Formatieren der Konsole Ausgabe

Hier ist, was ich in der Konsole enter image description here

Hier ist der Code immer ich habe.

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 

Antwort

11

Verwenden Sie %45s, um ein rechtsbündiges Feld mit 45 Zeichen Länge zu erstellen. Und verwenden Sie %-45s, um eine linksbündige Zeichenfolge zu erstellen. Ziehen Sie auch in Betracht, Ihren Liniendruck in eine Funktion zu extrahieren - auf diese Weise können Sie ihn an einer Stelle leicht ändern. Gefällt mir:

# 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

Danke, das funktioniert toll :), kann ich Sie fragen, warum Sie nicht genutzt 'type' als einer der Funktionsargumente? – cyberbemon

+1

ähm ... sollte binary_type oder so etwas sein ... typ ist eine schlechte Wahl des Namens, da es bereits eine Funktion in Python ist ... es wird immer noch funktionieren, aber kein guter Stil ... also habe ich es behoben oben über :) –

+1

Oder ['str.ljust'] (http://docs.python.org/library/stdtypes.html#str.rjust) kurz –

4

Anstelle der Registerkarten, ist es besser String Formatierungsanweisungen zu verwenden, wo es möglich ist, die genaue Anzahl der Räume zu spezifizieren und für die Ausgabe zu reservieren.

Zum Beispiel

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

wird reservieren 20 Räume und rechts -align diese Zeichenfolge für die Anzeige. Sie können links -justify es mithilfe %-20s

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

Zahlen angegeben werden können d für ganze Zahlen und f für Float-Werte verwenden. Z. B.

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

In diesem Beispiel reserviert I 3 Nullen aufgefüllten Räume für einen ganzzahligen Wert und 5 Bereiche für einen Schwimmer (2 für Werte nach dem Dezimalpunkt Raum). Sie können hier auch mit - steuern. Es gibt viele andere Optionen zum Formatieren der Ausgabe. Weitere Informationen finden Sie in den unten angegebenen Links.

Beachten Sie, dass die Verwendung der .format()-Funktion empfohlen wird. Siehe SO mein answer here über wie man .format() benutzt. Diese answer kann auch helfen.

Während .format sehr ausführlich erscheinen mag, bietet es eine große Flexibilität und eines meiner Lieblingsfeatures ist die Fähigkeit, Kommas in großen Zahlen für die Lesbarkeit leicht zu drucken.

Weitere Details finden Sie unter Python docs on String Formatting, damit Sie Ihre Ausgabe genau so ausrichten können, wie Sie es möchten.

2

Sie können es sehr vereinfachen, wenn Sie die Zeichenformatierung mit padding verwenden, z.

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

Sie könnten ein Drittanbietermodul zum Formatieren der Ausgabe auf der Konsole verwenden.

, d.h.: texttable

2

i wie

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

statt dessen etwas, was mit ihnen mit ljust empfehlen:

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