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.


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        '

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!'

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              '

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'

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!

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.


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}}'

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')

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.


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

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.


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:]

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                 '

... 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,
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.