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
John Mee
quelle
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))
Matthew Trevor
quelle
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 .

Marwan Alsabbagh
quelle
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                     '
Joran Beasley
quelle
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

user1767754
quelle
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.

Ketan
quelle
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.

Rohit Jain
quelle
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.

Nick Sweeting
quelle
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])
codeRunner89
quelle
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