Wie kann ich eine Python-Zeichenfolge mit Leerzeichen ausfüllen?

509

Ich möchte eine Zeichenfolge mit Leerzeichen ausfüllen. Ich weiß, dass das Folgende für Nullen funktioniert:

>>> print  "'%06d'"%4
'000004'

Aber was soll ich tun, wenn ich das will?:

'hi    '

Natürlich kann ich die Saitenlänge messen und tun str+" "*leftover, aber ich möchte den kürzesten Weg.

Verjüngung
quelle
1
Ich weiß, dass es in Zukunft möglicherweise veraltet sein wird, aber ich mag diese gute alte Methode immer noch: "%-6s" % sfür linksbündig und "%6s" % sfür rechtsbündig.
Basj

Antworten:

700

Sie können dies tun mit str.ljust(width[, fillchar]):

Geben Sie die Zeichenfolge linksbündig in einer Zeichenfolge mit der Länge width zurück . Das Auffüllen erfolgt mit dem angegebenen Füllzeichen (Standard ist ein Leerzeichen). Die ursprüngliche Zeichenfolge wird zurückgegeben, wenn die Breite kleiner als ist len(s).

>>> 'hi'.ljust(10)
'hi        '
Felix Kling
quelle
18
@simons Antwort ist flexibler und nützlicher beim Formatieren komplexerer Zeichenfolgen
CoatedMoose
3
oder @abbot 's, wenn Sie nicht mehr in der Lage sind, alte Versionen von Python zu unterstützen
CoatedMoose
1
ljust () ist jetzt veraltet. Siehe stackoverflow.com/questions/14776788/… für die richtige Vorgehensweise
Mawg sagt, Monica am
Es ist in Python 3 gegangen? Ich wollte nur hinzufügen, dass es auch Rjust und Center gibt, die ähnlich funktionieren, aber für unterschiedliche Ausrichtungen
Radtek
17
ljust (), rjust () wurden nur vom String-Modul verworfen. Sie sind für den eingebauten Typ str verfügbar.
Rohan Grover
374

Für eine flexible Methode, die auch beim Formatieren komplizierter Zeichenfolgen funktioniert, sollten Sie wahrscheinlich die Minisprache zum Formatieren von Zeichenfolgen verwenden , wobei Sie entweder die str.format()Methode verwenden

>>> '{0: <16} StackOverflow!'.format('Hi')  # Python >=2.6
'Hi               StackOverflow!'

von F-Saiten

>>> f'{"Hi": <16} StackOverflow!'  # Python >= 3.6
'Hi               StackOverflow!'
Simon
quelle
11
Was ist, wenn eine Variable '16' enthält?
Randy
Das habe ich auch herausgefunden. Hätte es posten sollen. Die Dokumente sagen, dass dies für Py2.6 funktionieren sollte, aber meine Ergebnisse sind anders. Funktioniert jedoch in Py2.7.
Randy
1
Ich hatte Probleme mit dieser Art der Formatierung, als ich nationale Akzente verwendete. Sie möchten, dass 'kra' und 'krá' gleich sind, aber das waren sie nicht.
Quapka
77
@ Randy'{message: <{fill}}'.format(message='Hi', fill='16')
CivFan
19
Nicht str.format()für Vorlagen mit nur einer {...}und nichts anderem verwenden. Verwenden Sie einfach die format()Funktion und sparen Sie sich den Parsing-Aufwand : format('Hi', '<16').
Martijn Pieters
119

Mit der neuen (ish) String-Format-Methode können Sie lustige Dinge mit verschachtelten Schlüsselwortargumenten tun. Der einfachste Fall:

>>> '{message: <16}'.format(message='Hi')
'Hi             '

Wenn Sie 16als Variable übergeben möchten :

>>> '{message: <{width}}'.format(message='Hi', width=16)
'Hi              '

Wenn Sie Variablen für das gesamte Kit und Kaboodle übergeben möchten :

'{message:{fill}{align}{width}}'.format(
   message='Hi',
   fill=' ',
   align='<',
   width=16,
)

Was dazu führt (Sie haben es erraten):

'Hi              '
CivFan
quelle
Wie würden Sie auch mit dem Variieren der Nachricht umgehen? msgs = ['hi', 'hallo', 'ciao']
ak_slick
1
@ak_slick Sie können Variablen anstelle von fest codierten Werten an die Formatierungsfunktion übergeben.
CivFan
80

Sie können dies versuchen:

print "'%-100s'" % 'hi'
Abt
quelle
print "'% -6s'"% 'hi' in der Tat !!
Verjüngung
8
@ Simon als jemand auf einem Python2.5-System stecken diese Antwort hat mir geholfen, keine nutzlose Antwort +1
Sunshinekitty
18
Nicht mehr veraltet in 3.3+
Seppo Erviälä
3
Ich mag diese übliche printf-Syntax viel besser. Ermöglicht das Schreiben komplexer Zeichenfolgen ohne unzählige Verkettungen.
Max Tsepkov
4
Der Vollständigkeit "'%+100s'" % 'hi''hi'
Eric Blum
62

Der richtige Weg, dies zu tun, wäre die Verwendung der Python-Formatsyntax, wie in der offiziellen Dokumentation beschrieben

In diesem Fall wäre es einfach:
'{:10}'.format('hi')
Welche Ausgänge:
'hi '

Erläuterung:

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <any character>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

So ziemlich alles, was Sie wissen müssen, ist da ^.

Update: Ab Python 3.6 ist die wörtliche String-Interpolation noch praktischer!

foo = 'foobar'
print(f'{foo:10} is great!')
# foobar     is great!
Granitosaurus
quelle
37

Verwendung str.ljust():

>>> 'Hi'.ljust(6)
'Hi    '

Sie sollten auch berücksichtigen string.zfill(), str.ljust()und str.center()für die Formatierung von Zeichenfolgen. Diese können verkettet werden und haben das angegebene ' Füll' -Zeichen, also:

>>> ('3'.zfill(8) + 'blind'.rjust(8) + 'mice'.ljust(8, '.')).center(40)
'        00000003   blindmice....        '

Diese Zeichenfolgenformatierungsvorgänge haben den Vorteil, dass sie in Python v2 und v3 funktionieren.

Schauen Sie sich mal an pydoc str: Es gibt eine Fülle guter Sachen.

Johnsyweb
quelle
27

Ab Python 3.6 können Sie dies einfach tun

>>> strng = 'hi'
>>> f'{strng: <10}'

mit Literal-String-Interpolation .

Oder wenn Ihre Polstergröße in einer Variablen wie dieser liegt (danke @Matt M.!):

>>> to_pad = 10
>>> f'{strng: <{to_pad}}'
WAF
quelle
4
f'{strng: >10}'zum Füllen eines Strings mit führenden Leerzeichen bis zu einer Länge von 10. Das ist Magie. Und es ist nicht gut dokumentiert.
Chang Ye
@changye Ich glaube, dies ist auch das Standardverhalten von f'{strng:10}'.
WAF
17

Sie können auch zentrieren Ihre string:

'{0: ^20}'.format('nice')
Remi
quelle
7

Verwenden Sie die Mini-Formatierung von Python 2.7 für Zeichenfolgen :

'{0: <8}'.format('123')

Diese Linke wird ausgerichtet und mit dem Zeichen '' auf 8 Zeichen aufgefüllt.

aodj
quelle
4
@simon hat diese Antwort bereits gegeben ... warum eine doppelte Antwort posten?
Felix Kling
5
Ich habe nicht auf "Neue Antworten wurden veröffentlicht, zum Aktualisieren klicken" geklickt und es daher verpasst.
Aodj
5

Entfernen Sie einfach die 0 und es wird stattdessen Platz hinzugefügt:

>>> print  "'%6d'"%4
Amir Mofakhar
quelle
2

Wäre es nicht pythonischer, Slicing zu verwenden?

So füllen Sie beispielsweise eine Zeichenfolge mit Leerzeichen auf der rechten Seite auf, bis sie 10 Zeichen lang ist:

>>> x = "string"    
>>> (x + " " * 10)[:10]   
'string    '

So füllen Sie es mit Leerzeichen auf der linken Seite auf, bis es 15 Zeichen lang ist:

>>> (" " * 15 + x)[-15:]
'         string'

Natürlich müssen Sie wissen, wie lange Sie auffüllen möchten, aber Sie müssen nicht die Länge der Zeichenfolge messen, mit der Sie beginnen.

Zev Chonoles
quelle
9
Nein, würde es nicht.
Mad Physicist
1
Können Sie das näher erläutern? Es ist nicht so, dass ich dir nicht glaube, ich will nur verstehen warum.
Zev Chonoles
4
Sicher. Der pythonischste Weg wäre, eine der eingebauten Funktionen zu verwenden, anstatt so oft wie möglich eine selbst entwickelte Lösung zu verwenden.
Mad Physicist
@MadPhysicist zu sagen, dass das Schneiden weniger pythonisch ist, weil Sie es in eingebauten Funktionen verwenden sollten, ist wie zu sagen, dass ''.join(reversed(str))es pythonischer ist als str[::-1], und wir alle wissen, dass das nicht stimmt.
Nick
@ NickA. Das ist keine sehr gute Analogie. Der Fall, den Sie als Beispiel verwenden, ist durchaus gültig. Allerdings (x + " " * 10)[:10]ist meiner Meinung nach viel komplizierter als die Verwendung x.ljust(10).
Mad Physicist
0

Ein schöner Trick, der anstelle der verschiedenen Druckformate verwendet werden kann:

(1) Pad mit Leerzeichen rechts:

('hi' + '        ')[:8]

(2) Pad mit führenden Nullen links:

('0000' + str(2))[-4:]
Erik Anderson
quelle
1
Aus irgendeinem Grund ist dies die lustigste Antwort, aber ich mag es. In diesem Sinne auch berücksichtigen: min_len = 8dann ('hi' + ' '*min_len)[:min_len]oder('0'*min_len + str(2))[-min_len]
Poikilos
1
Für die Nummer wäre es ('0'*min_len + str(2))[-min_len:]eher, obwohl dies nur zum Spaß ist, und ich empfehle die anderen Antworten.
Poikilos
-1

Sie könnten dies mit Listenverständnis tun. Dies würde Ihnen auch eine Vorstellung von der Anzahl der Leerzeichen geben und wäre ein Einzeiler.

"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello                 '
foobar666
quelle
... und dann bekommst du eine Zeichenfolge, die 22 (len ("hallo") + 17 :() Zeichen lang ist - das ist nicht gut gelaufen. Während wir lustig sind, könnten wir es tun s = "hi"; s + (6-len(s)) * " "stattdessen (es ist in Ordnung, wenn Das Ergebnis ist negativ. Antworten, die eine beliebige Framework-Funktion verwenden, die das genaue Problem behebt, sind jedoch einfacher zu pflegen (siehe andere Antworten).
Poikilos,