Python bietet ex­zel­len­te Un­ter­stüt­zung für String-Ope­ra­tio­nen und Text­ver­ar­bei­tung. Die Sprache be­inhal­tet reich­hal­ti­ge Optionen zur For­ma­tie­rung und Ausgabe von Texten. Wir stellen die wich­tigs­ten Methoden zur Python-String-For­ma­tie­rung vor.

Web­hos­ting
Das beste Web­hos­ting zum Spit­zen­preis
  • 3x schneller und 60 % günstiger
  • Maximale Ver­füg­bar­keit mit > 99.99 %
  • Nur bei IONOS: Bis zu 500 GB Spei­cher­platz inklusive

Wozu werden in Python die String-Format-Methoden verwendet?

Strings sind Zei­chen­ket­ten und können in Python einzelne Buch­sta­ben, Wörter, Sätze oder auch ganze Dokumente enthalten. In der Praxis benötigt man häufig Methoden zum For­ma­tie­ren von Strings. Damit sind kei­nes­falls visuelle Aus­zeich­nun­gen wie Fettdruck in Word gemeint. Worum also geht es?

Strings lassen sich aus mehreren Stücken zu­sam­men­set­zen. In vielen Fällen möchte man statische String-Be­stand­tei­le und variable Daten ver­mi­schen. Benötigt wird dies bei der Ausgabe von Daten und dem Erzeugen von Do­ku­men­ten in der Web­ent­wick­lung.

Stellen wir uns bei­spiels­hal­ber einen On­line­shop vor. Wir möchten den Ge­samt­preis der Produkte im Ein­kaufs­wa­gen berechnen und dem Nutzer bzw. der Nutzerin anzeigen: „Der Ge­samt­preis beträgt […] Euro.“ Ein erster Lö­sungs­an­satz besteht darin, den String per Kon­ka­te­na­ti­ons-Operator zu­sam­men­zu­bau­en:

price = 69.42
message = "The total price is" + price + "EUR"

Leider bekommen wir eine Feh­ler­mel­dung, denn der Preis ist eine Zahl und lässt sich nicht mit einem String kon­ka­te­nie­ren. Wir müssen die Zahl zunächst mit der str()-Funktion in einen String kon­ver­tie­ren:

message = "The total price is" + str(price) + "EUR"

Das wird schnell un­über­sicht­lich. Besser wäre es, den gesamten Text samt Platz­hal­ter zu de­fi­nie­ren und diesen mit Daten zu befüllen. Beim Umwandeln der Daten gilt es ggf., deren For­ma­tie­rung an­zu­pas­sen. Genau diese An­for­de­run­gen erfüllen die Python String-Format-Methoden.

Wie funk­tio­nie­ren die Python-String-Format-Methoden?

Python un­ter­stützt mehrere String-Format-Methoden, jeweils mit eigenen Vor- und Nach­tei­len. Die Vielfalt ist his­to­risch gewachsen, wodurch es zwischen den einzelnen Methoden viele Ge­mein­sam­kei­ten und einige Un­ter­schie­de gibt. Wir stellen die vier be­kann­tes­ten Ansätze zur Python-String-For­ma­tie­rung vor:

  1. String-For­ma­tie­rung mit dem Modulo-Operator
  2. String-For­ma­tie­rung mit der str.format()-Methode
  3. String-For­ma­tie­rung mit String-In­ter­po­la­ti­on
  4. String-For­ma­tie­rung mit Template-Strings

Modulo-Operator

Diese älteste in Python ein­ge­bau­te String-For­ma­tie­rung nutzt den Python-Operator für Pro­zent­zei­chen, der sonst für die ma­the­ma­ti­sche Modulo-Operation verwendet wird. Der Ansatz ist daher auch als Modulo-String-For­ma­tie­rung bekannt.

Wir nutzen im Folgenden ein Schema mit drei Variablen. Die ei­gent­li­chen Namen spielen keine Rolle; wir haben diese so gewählt, damit der Code möglichst gut nach­voll­zieh­bar ist.

Kom­po­nen­te Be­zeich­nung
String-Vorlage mit Platz­hal­ter(n) template
Modulo-Operator %
Ein­zu­fü­gen­de Daten data
Fertig for­ma­tier­ter String message

Zunächst de­fi­nie­ren wir die Vorlage als String-Variable mit dem Namen template. Innerhalb der Vorlage legen wir die Position des Platz­hal­ters mit dem Kürzel %s fest:

template = "The total price is %s"

Im Anschluss de­fi­nie­ren wir den ein­zu­fü­gen­den Wert als Variable mit Namen data:

data = 69.51

Um die Python-String-For­ma­tie­rung durch­zu­füh­ren, schreiben wir die String-Vorlage, gefolgt vom Modulo-Operator und schließ­lich der data-Variable. Den for­ma­tier­ten String weisen wir im selben Zuge der message-Variable zu:

message = template % data

Bei den Daten kann es sich um eine Variable handeln. Wir können aber genauso gut ein Literal oder einen Ausdruck verwenden. Die Modulo-Operation lässt sich auf einer einzigen Zeile un­ter­brin­gen. Hier ein Beispiel mit einem String-Literal, das anstelle des Platz­hal­ters eingefügt wird:

message = "Here comes %s" % "Jack"

Ein weiteres Beispiel: Wir berechnen die Summe von Ein­zel­prei­sen und fügen den Ge­samt­preis in die Nachricht ein. Es kommt dasselbe Schema zum Tragen; dabei zeigen wir, dass nach dem Modulo-Operator ein Ausdruck folgen darf:

prices = (42, 69, 51)
message = "The total price is %s" % sum(prices)

Viel­leicht fragen Sie sich an diesem Punkt, warum als Platz­hal­ter %s verwendet wird und nicht einfach nur das Pro­zent­zei­chen an sich. In der Tat hat das „s“ eine besondere Bedeutung: Beim Einfügen der Daten werden diese mit der str()-Funktion in einen String um­ge­wan­delt.

Es gibt in Python weitere String-For­ma­tie­rungs-Kürzel, die z. B. Zahlen speziell for­ma­tie­ren. An­schau­lich dar­stel­len lässt sich dies am Beispiel der Kreiszahl Pi. Wir füllen die Zahl dazu einmal in den schon bekannten Platz­hal­ter %s ein. Die Ausgabe enthält 15 Nach­kom­ma­stel­len:

from math import pi as PI
print("The value of Pi is approximately %s" % PI)

Nutzen wir statt­des­sen das Kürzel %g als Platz­hal­ter, werden lediglich fünf Nach­kom­ma­stel­len angezeigt:

print("The value of Pi is approximately %g" % PI)

Neben %s und %g existiert eine Reihe weiterer Optionen – siehe dazu den folgenden Abschnitt.

Es ist mit Pythons Modulo-String-For­ma­tie­rung auch möglich, mehrere Platz­hal­ter zu de­fi­nie­ren und zu befüllen. In dem Fall erwartet der Modulo-Operator ein Tupel mit genauso vielen Werten, wie Platz­hal­ter vorhanden sind. Die Platz­hal­ter werden mit den Werten befüllt:

person = ('John', 42)
message = "My friend %s is %s years old" % person

Sie sehen schon, besonders lesbar ist die Python-String-For­ma­tie­rung mit Modulo-Operator nicht. Etwas schöner wird es, wenn wir statt eines Tupels ein Dict mit den Daten übergeben. In diesem Fall tragen wie die Namen der Dict-Einträge zwischen Klammern hinter dem Pro­zent­zei­chen der Platz­hal­ter ein. So wird beim Lesen der String-Vorlage er­sicht­lich, welche Werte zu erwarten sind:

person = {'name': 'John', 'age': 42}
message = "My friend %(name)s is %(age)s years old" % person

str.format()-Methode

Pythons String-Format-Methode ist eine Ver­bes­se­rung der Modulo-For­ma­tie­rung, die ur­sprüng­lich in Python 3 enthalten war und später nach Python 2.6 über­tra­gen wurde. Statt eines spe­zi­el­len Operators wird ein ob­jekt­ori­en­tier­ter Ansatz angewandt. Damit ist str.format() kon­sis­tent mit anderen String-Methoden, etwa Pythons str.split-Funktion.

Das grund­le­gen­de Schema der Python str.format()-Methode ähnelt der For­ma­tie­rung mit dem Modulo-Operator und existiert in ähnlicher Form auch in .NET und Rust. Als Platz­hal­ter im Template-String kommen ge­schweif­te Klammern zum Einsatz, die Daten werden als Argumente des Funk­ti­ons­auf­rufs übergeben:

template = "Here comes {}"
data = 'Jack'
message = template.format(data)

Enthält der Template-String mehrere Platz­hal­ter, übergeben wir ent­spre­chend viele Argumente:

message = "My friend {} is {} years old".format('John', 42)

Optional spe­zi­fi­zie­ren wir die Position der ein­zu­bin­den­den Argumente als Indizes. So lässt sich die Rei­hen­fol­ge der Platz­hal­ter von den Ar­gu­men­ten ent­kop­peln. Bedenken Sie dabei, dass Indizes bei null beginnen:

message = "My friend {1} is {0} years old".format(69, 'Jim')

Sofern die einzelnen Werte in einer Da­ten­struk­tur vorliegen, nutzen wir den Sternchen-Operator vor dem Argument, um die Da­ten­struk­tur zu entpacken. Das funk­tio­niert mit Listen und Tupeln:

person = ('John', 42)
message = "My friend {} is {} years old".format(*person)

Bei längeren Strings werden die nichts­sa­gen­den Platz­hal­ter schnell ver­wir­rend. Schöner ist es, benannte Argumente zu benutzen:

template = "My friend {name} is {age} years old"
message = template.format(name = 'Jack', age = 51)

Bei vielen Werten würde die Ar­gu­ment­lis­te sehr lang und damit un­über­sicht­lich. Dann ist es besser, die Werte in einem Dict zu­sam­men­zu­fas­sen und das Dict beim Funk­ti­ons­auf­ruf zu entpacken. Anders als bei Listen und Tupeln nutzen wir zum Entpacken eines Dicts ein Dop­pel­stern­chen:

# define dict
person = {'name': 'Jim', 'age': 69}
# define string with placeholders
template = "My friend {name} is {age} years old"
# unpack dict in `format()` call
message = template.format(**person)

Besonders an der Python-String-For­ma­tie­rung mit str.format() sind die viel­fäl­ti­gen For­ma­tie­rungs­op­tio­nen. Sie erweitern den Funk­ti­ons­um­fang der Modulo-For­ma­tie­rung und sind besonders mächtig für die Ausgabe von Text auf der Kom­man­do­zei­le sowie für ta­bel­la­ri­sche Daten. Im Folgenden stellen wir den Me­cha­nis­men zum For­ma­tie­ren von Zahlen vor.

Python bietet präzise Kontrolle bei der Ausgabe von Zahlen als Text. So lässt sich festlegen, wie die Vor­zei­chen von Zahlen angezeigt werden sollen. Für De­zi­mal­zah­len lässt sich ferner die Anzahl an Nach­kom­ma­stel­len bestimmen. Nützlich ist das bei der ta­bel­la­ri­schen Dar­stel­lung positiver oder negativer Zahlen.

Stellen wir uns vor, wir wollen Tem­pe­ra­tur­mes­sun­gen ausgeben:

samples = [('A0147D', 27.6), ('X1489M', -4.7), ('P9921U', -10.93)]
for sample in samples:
    print('| {} | {} |'.format(*sample))

Die Ausgabe erscheint zerhackt, da die Zahlen un­ter­schied­lich lang sind:

| A0147D | 27.6 |
| X1489M | -4.7 |
| P9921U | -10.93 |

Wir passen den Code an und de­fi­nie­ren eine Reihe von For­ma­tie­rungs-Optionen:

for sample in samples:
    print('| {} | {: 6.2f} |'.format(*sample))

Jetzt passt die Ausgabe:

| A0147D | 27.60 |
| X1489M | -4.70 |
| P9921U | -10.93 |

Schauen wir uns die For­ma­tie­rungs-Optionen des zweiten Platz­hal­ters genauer an. Diese folgen nach dem Dop­pel­punkt und umfassen vier Kom­po­nen­ten:

  1. Leer­zei­chen: stellt positiven Zahlen ein Leer­zei­chen voran, um den vom Mi­nus­zei­chen negativer Zahlen ein­ge­nom­me­nen Platz aus­zu­glei­chen
  2. Zahl vor dem Punkt: Anzahl der insgesamt für die Zahl zur Verfügung stehenden Buch­sta­ben
  3. Zahl nach dem Punk: Anzahl der Nach­kom­ma­stel­len; füllt ggf. mit Nullen auf
  4. Buchstabe „f“ vor der schlie­ßen­den ge­schweif­ten Klammer: for­ma­tiert die Zahl als De­zi­mal­zahl

Es gibt eine Reihe weiterer For­ma­tie­rungs-Optionen, mit denen sich die Ausgabe von Zahlen und Strings präzise steuern lässt. Im täglichen Gebrauch ist der Einsatz eher selten; bei Bedarf schaut man in der of­fi­zi­el­len Python String For­ma­tie­rungs-Do­ku­men­ta­ti­on nach.

String-In­ter­po­la­ti­on

Seit Python 3.6 ist die String-In­ter­po­la­ti­on als weitere For­ma­tie­rungs-Methode verfügbar. Der auch als „f-Strings“ bekannte Ansatz ist für viele An­wen­dungs­fäl­le am kom­for­ta­bels­ten und am per­for­man­tes­ten. Der Name entstammt der ge­ne­rel­len Syntax; f-Strings beginnen mit dem Buch­sta­ben „f“ direkt vor den öffnenden An­füh­rungs­zei­chen.

Als Platz­hal­ter kommen ge­schweif­te Klammern zum Einsatz. Anders als bei den bisher vor­ge­stell­ten Methoden enthalten die Platz­hal­ter keinen Index oder Namen, sondern einen be­lie­bi­gen Ausdruck. Beim De­fi­nie­ren des f-Strings werden die Platz­hal­ter sofort befüllt:

message = f"40 + 2 equals {40 + 2}"

Der Ausdruck kann auch der Name einer Variable sein:

name = 'Jack'
message = f"Here comes {name}"

Es lassen sich pro­blem­los mehrere Ausdrücke einbinden:

prices = (42, 69, 51)
currency = 'EUR'
message = f"The total price is {sum(prices)} {currency}"

Template-Strings

Neben den drei vor­ge­stell­ten Methoden un­ter­stützt Python die String-For­ma­tie­rung mit so­ge­nann­ten Template-Strings. Diese werden aus einer eigenen Klasse erzeugt und bieten Schutz vor Si­cher­heits­lü­cken beim For­ma­tie­ren von Strings, die vom Nutzer bzw. von der Nutzerin stammen.

Die For­ma­tie­rungs­mög­lich­kei­ten innerhalb von Template-Strings sind begrenzt. So dürfen die Platz­hal­ter anstelle be­lie­bi­ger Ausdrücke lediglich Va­ria­blen­na­men enthalten. Aufgrund ihrer Ein­fach­heit sind Template-Strings gut geeignet zur In­ter­na­tio­na­li­sie­rung von Strings, die in mehreren Sprachen vorliegen.

Als Platz­hal­ter kommt ein Dol­lar­zei­chen, gefolgt vom Namen der ein­zu­set­zen­den Variable, zum Einsatz. Damit ähneln Template-Strings der Syntax von Shell-Sprachen wie Bash oder Zsh. Das Einsetzen des Wertes erfolgt beim Aufruf der sub­sti­tu­te()-Methode:

# import `Template` class from `string` module
from string import Template
# instantiate template
template = Template("Hey there, I'm $name")
# perform substitution
message = template.substitute(name = 'Jack')

Wie in Shell-Sprachen gibt es eine weitere Syntax für die Platz­hal­ter. Dabei folgen dem Dol­lar­zei­chen ge­schweif­te Klammen, die den Namen der Variable enthalten. So lassen sich Er­set­zun­gen innerhalb eines Wortes vornehmen:

template = Template("Let's buy $amount ${fruit}s")
message = template.substitute(amount = 3, fruit = 'orange')

Welche Methode für das Python-String-Format sollte man wählen?

Die einzelnen Methoden haben spe­zi­fi­sche Ei­gen­hei­ten, die wir hier zu­sam­men­fas­sen:

Methode Schema Platz­hal­ter Nutzen
Modulo-For­ma­tie­rung template % data %, %(key) bei Python Version < 2.6
str.format() template.format(data) {}, {index}, {key} für komplexe For­ma­tie­run­gen
f-String f"{ex­pres­si­on}" {ex­pres­si­on} für um­fang­rei­che Strings
Template-String template.sub­sti­tu­te(data) ${iden­ti­fier} wenn die Strings von Nut­zer­sei­te stammen
Zum Hauptmenü