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.