Wie kann ich eine Zeichenfolge mit fester Breite nach links ausrichten?


71

Ich möchte nur Textspalten mit fester Breite, aber die Zeichenfolgen sind alle rechts statt links aufgefüllt !!?

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

produziert

BGA                                BEGA CHEESE LIMITED   Food Beverage & Tobacco
BHP                               BHP BILLITON LIMITED                 Materials
BGL                               BIGAIR GROUP LIMITED Telecommunication Services
BGG           BLACKGOLD INTERNATIONAL HOLDINGS LIMITED                    Energy

aber wir wollen

BGA BEGA CHEESE LIMITED                                Food Beverage & Tobacco
BHP BHP BILLITON LIMITED                               Materials
BGL BIGAIR GROUP LIMITED                               Telecommunication Services
BGG BLACKGOLD INTERNATIONAL HOLDINGS LIMITED           Energy

shweet! danke ... es musste ziemlich einfach sein. ähm jetzt mit 3 gleichzeitig richtigen Antworten, wer bekommt das grüne Häkchen?
John Mee

Antworten:


123

Sie können der Größenanforderung linksbündig voranstellen -:

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

Schöne Lösung. Dies ist die beste Lösung.
SuB

Was ist, wenn meine Größen- / Breitenwerte variabel sind?
ViFI

@ViFI Sie können * Symbol wie dieses verwenden'%-*sText'%(3,'A')
Chamod

45

Diese Version verwendet die Methode str.format .

Python 2.7 und neuer

sys.stdout.write("{:<7}{:<51}{:<25}\n".format(code, name, industry))

Python 2.6 Version

sys.stdout.write("{0:<7}{1:<51}{2:<25}\n".format(code, name, industry))

AKTUALISIEREN

Zuvor gab es in den Dokumenten eine Aussage darüber, dass der Operator% in Zukunft aus der Sprache entfernt wird. Diese Anweisung wurde aus den Dokumenten entfernt .


5
Der alte Stil wird nicht länger veraltet sein, glaube ich: bugs.python.org/issue14123
Matthew Trevor

Es sieht so aus, als ob dieses Problem abgelehnt wird. Phase: begangen / abgelehnt
Marwan Alsabbagh

Dieser Status wird auch verwendet, um "festgeschrieben" anzuzeigen, was definitiv darauf zurückzuführen ist, dass die Änderungen an der Dokumentation vorgenommen wurden. Was in den 3.2-Dokumenten "Alte Zeichenfolgenformatierungsvorgänge" war, ist jetzt die druckformatierte Zeichenfolgenformatierung in 3.3. Die mögliche Abwertungswarnung - sie sagte tatsächlich " kann verschwinden", sie war nie endgültig - fehlt nun auch in diesem Abschnitt und wird durch eine Warnung ersetzt, dass sie "schrullig" sei. Es geht nicht weg.
Matthew Trevor

2
Sie betrachten einen anderen Teil der Dokumente. Der Abschnitt Alte Zeichenfolgenformatierung ist in 3.3-Dokumenten noch vorhanden. Er befindet sich unter dem Tutorial-Abschnitt und nicht unter der Bibliotheksreferenz. und die Aussage "Dieser alte Formatierungsstil wird irgendwann aus der Sprache entfernt" ist immer noch da.
Marwan Alsabbagh

4
@Matthew - Desinformation ist eine falsche Information, die irreführen soll. Ich bezweifle, dass Marwan solche Absichten hatte.
Nick Chammas

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

Nebenbei können Sie die Breite mit variabel machen *-s

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

17

Ich bevorzuge die formatMethode definitiv mehr, da sie sehr flexibel ist und leicht durch Definieren __format__oder die stroder reprDarstellungen auf Ihre benutzerdefinierten Klassen erweitert werden kann . Um es einfach zu halten, verwende ich printin den folgenden Beispielen, die durch ersetzt werden können sys.stdout.write.

Einfache Beispiele: Ausrichtung / Füllung

#Justify / ALign (left, mid, right)
print("{0:<10}".format("Guido"))    # 'Guido     '
print("{0:>10}".format("Guido"))    # '     Guido'
print("{0:^10}".format("Guido"))    # '  Guido   '

Wir können zu dem nächsten hinzufügen aligngibt an, welche sind ^, <und >ein Füllzeichen den Raum von einem anderen Charakter ersetzen

print("{0:.^10}".format("Guido"))    #..Guido...

Beispiele für Mehrfacheingaben: Viele Eingaben ausrichten und füllen

print("{0:.<20} {1:.>20} {2:.^20} ".format("Product", "Price", "Sum"))
#'Product............. ...............Price ........Sum.........'

Erweiterte Beispiele

Wenn Sie über benutzerdefinierte Klassen verfügen, können Sie diese stroder reprDarstellungen wie folgt definieren:

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

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

Jetzt können Sie mit !s(str) oder !r(repr) Python anweisen, diese definierten Methoden aufzurufen. Wenn nichts definiert ist, werden die Standardeinstellungen von Python ebenfalls __format__überschrieben. x = foo ()

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

Quelle: Python Essential Reference, David M. Beazley, 4. Auflage


14

Mit den neuen und beliebten F-Strings in Python 3.6 können wir beispielsweise einen String mit 16 Polsterlängen linksbündig ausrichten:

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

Wenn Sie eine variable Polsterlänge haben:

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

F-Saiten sind kompakter.


strist in Python integriert, daher ist es nicht ideal, diesen als Objektnamen zu verwenden.
Alichaudry

2
Sie können auch die Richtung Zeichen setzen >, <, ^usw., als eine Variable, so nach a="<", können Sie:f"{string:{a}{k}"
Thruston

9

Verwenden Sie -50%anstelle von +50%Sie werden nach links ausgerichtet.


Beispiel: print "%-30s" % (name)Zum Drucken des Namens mit linker Einrückung.
Fraurinivas

5

Eine etwas besser lesbare alternative Lösung:
sys.stdout.write(code.ljust(5) + name.ljust(20) + industry)

Beachten Sie, dass ljust(#ofchars)Zeichen mit fester Breite verwendet werden und sich nicht wie bei den anderen Lösungen dynamisch anpassen.


4

Dieser hat in meinem Python-Skript funktioniert:

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

1
Ich bin nicht sicher, was dies in Bezug auf die Differenzierung von irgendetwas anderem hinzufügt. und was zum Teufel ist Thread-Array?
UpAndAdam
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.