Formatfelder und Breite
Stringformatierung bestimmt, wie Werte als Text erscheinen. Damit kannst du Tabellenspalten ausrichten, eine Zahlendarstellung wählen, die Genauigkeit steuern und verständliche Meldungen zusammensetzen. Python stellt dafür die Methode str.format() und F-Strings bereit.
Ein einfaches Ersetzungsfeld hat die Form {field_name:format_spec}. Eine Breite innerhalb der Formatspezifikation legt eine Mindestbreite fest. Braucht der formatierte Wert mehr Platz, gibt Python ihn vollständig aus.
Formattypen für Zahlensysteme
Ein Formatbezeichner kann eine ganze Zahl in einem anderen Zahlensystem darstellen. Die Tabelle nennt die Typzeichen und die Ausgabe, die jedes für denselben Wert erzeugt.
| Formattyp | Symbol | Beispieleingabe | Ausgabe | Verwendung |
|---|---|---|---|---|
| Dezimal | d | 45 | 45 | Dezimale Ganzzahl |
| Binär | b | 45 | 101101 | Bitdarstellung |
| Oktal | o | 45 | 55 | Darstellung zur Basis acht |
| Hexadezimal | x/X | 45 | 2d/2D | Basis sechzehn mit Klein- oder Großbuchstaben |
# Breitensteuerung bei verschiedenen Formaten
print('|{0:15}|'.format('xxx')) # Ausgabe: |xxx |
print('a = {0:6d}'.format(45)) # Ausgabe: a = 45
print('a = {0:10b}'.format(45)) # Ausgabe: a = 101101
print('a = {0:6x}'.format(45)) # Ausgabe: a = 2d
# Breite kleiner als String - nicht abgeschnitten
print('|{0:1}|'.format('xxx')) # Ausgabe: |xxx|Positionseinstellungen und Füllzeichen
Ein Feld fester Breite braucht eine Regel, wo der Text steht und womit der Rest gefüllt wird. Das Ausrichtungszeichen setzt den Wert an den linken oder rechten Rand oder in die Mitte dieser Breite, und ein Füllzeichen bestimmt, welches Symbol den übrigen Platz auffüllt. Zusammen halten sie Zahlen und Beschriftungen in sauberen Spalten.
Ausrichtungsoptionen
Das Diagramm vergleicht denselben Text links, rechts und mittig in einer festen Breite, damit das Ausrichtungszeichen leicht zu lesen ist.
| Symbol | Name | Verhalten | Standard für |
|---|---|---|---|
< | Links | Text links, Abstand rechts | Strings |
> | Rechts | Text rechts, Abstand links | Zahlen |
^ | Zentriert | Text in der Mitte, gleichmäßiger Abstand | - |
Füllzeichen und erweiterte Formatierung
Das Füllzeichen belegt den ungenutzten Raum im Feld. Standardmäßig ist es ein Leerzeichen und steht unmittelbar vor dem Ausrichtungssymbol. In str.format() und F-Strings können die literalen Zeichen { und } nicht als Füllzeichen dienen.
# Grundlegende Ausrichtung
print('|{0:<15}|'.format('xxx')) # Ausgabe: |xxx |
print('|{0:>15}|'.format('xxx')) # Ausgabe: | xxx|
print('|{0:^15}|'.format('xxx')) # Ausgabe: | xxx |
# Benutzerdefinierte Füllzeichen
print('|{0:-<15}|'.format('xxx')) # Ausgabe: |xxx------------|
print('|{0:*>15}|'.format('xxx')) # Ausgabe: |************xxx|
print('|{0:^^15}|'.format('xxx')) # Ausgabe: |^^^^^^xxx^^^^^^|
# Decimal formatting
x = 123.98
print('x = {0:12f}'.format(x)) # Ausgabe: x = 123.980000
print('x = {0:12e}'.format(x)) # Ausgabe: x = 1.239800e+02Argumentreferenzmethoden
Ein Ersetzungsfeld wählt den Wert für die Textausgabe. Verwende einen Index für ein Positionsargument, einen Namen für ein Schlüsselwortargument oder die automatische Nummerierung, um Positionsargumente der Reihe nach einzusetzen.
Vergleich der Referenzmethoden
Ein Formatstring kann seine Argumente auf drei Arten benennen. Die Tabelle vergleicht sie danach, was jede Art braucht und wo sie endet.
| Methode | Syntax | Vorteile | Einschränkungen |
|---|---|---|---|
| Nummeriert | {0}, {1} | Explizite Kontrolle, kann wiederholt werden | Jeder verwendete Index muss vorhanden sein |
| Schlüsselwort | {name}, {age} | Jeder Name kennzeichnet seinen Wert und kann wiederholt werden | Namen müssen übereinstimmen |
| Automatisch | {}, {} | Einfache Syntax | Nicht mit nummerierten Feldern kombinierbar |
# Nummerierte Felder - explizite Kontrolle
print('{2} - {0} - {1}'.format('first', 'second', 'third'))
# Ausgabe: third - first - second
# Schlüsselwortfelder - Namen verwenden
print('{name} ist {age} Jahre alt'.format(name='Alice', age=25))
# Ausgabe: Alice ist 25 Jahre alt
# Automatische Nummerierung - fortlaufende Reihenfolge
print('{} + {} = {}'.format(5, 3, 8))
# Ausgabe: 5 + 3 = 8
# Fehlerbehandlung
try:
print('{a} - {b}'.format(a='xxx')) # Wird Fehler machen
except KeyError as e:
print(f"KeyError: {e}") # Ausgabe: KeyError: 'b'
try:
print('{0} - {1}'.format('xxx')) # Wird Fehler machen
except IndexError as e:
print(f"IndexError: {e}") # Ausgabe: IndexError: Replacement index 1 out of range for positional args tuplePräzision und Vorzeichen
Die Präzision steuert die Ziffern im formatierten Text. Die Vorzeichenoption bestimmt, ob ein Plus, Minus oder Leerzeichen erscheint. Zum Beispiel ergibt format(12.3, "+.2f") den Text +12.30: Das Pluszeichen und die zwei Nachkommastellen stammen aus getrennten Optionen.
Präzision für Dezimalzahlen
Die Bedeutung der Präzision hängt vom Darstellungstyp ab. Bei f und e bestimmt sie die Stellen nach dem Dezimalpunkt, bei g die Anzahl signifikanter Ziffern. Jede Tabellenzeile verwendet die Eingabe 123.98765. So vergleichst du verschiedene Darstellungen desselben Werts.
| Formattyp | Präzisionsverhalten | Beispiel |
|---|---|---|
f/F | Dezimalstellen | {:.2f} → 123.99 |
e/E | Dezimalstellen in wissenschaftlicher Schreibweise | {:.2e} → 1.24e+02 |
g/G | Signifikante Ziffern | {:.3g} → 124 |
Vorzeichenoptionen
In der Leerzeichenzeile ist das Symbol ein Leerzeichen innerhalb des Formatbezeichners, wie in {: d}. Da dieses Zeichen unsichtbar ist, wird es in der Tabelle als literales Leerzeichen bezeichnet.
| Symbol | Verhalten | Beispiel |
|---|---|---|
+ | Vorzeichen immer anzeigen | +100, -200 |
- | Nur negatives Vorzeichen (Standard) | 100, -200 |
| literales Leerzeichen | Lässt ein Leerzeichen vor einer positiven Zahl | ' 100', '-200' |
# Precision control
print('x = {0:.3f}'.format(123.98765)) # Ausgabe: x = 123.988
print('x = {0:12.2e}'.format(1.987e-10)) # Ausgabe: x = 1.99e-10
print('x = {0:.3g}'.format(1.123456)) # Ausgabe: x = 1.12
# Vorzeichen festlegen
numbers = [-100, 200, -300]
print('Default:', ['{:d}'.format(n) for n in numbers])
# Ausgabe: Default: ['-100', '200', '-300']
print('Always sign:', ['{:+d}'.format(n) for n in numbers])
# Ausgabe: Always sign: ['-100', '+200', '-300']
print('Leerzeichen vor positiven Zahlen:', ['{: d}'.format(n) for n in numbers])
# Ausgabe: Leerzeichen vor positiven Zahlen: ['-100', ' 200', '-300']
# Rounding behavior
print('Tiny number f: {0:12f}'.format(1.1e-10)) # Ausgabe: Tiny number f: 0.000000
print('Tiny number g: {0:12g}'.format(1.1e-10)) # Ausgabe: Tiny number g: 1.1e-10Formatierte Strings und dynamische Vorlagen
F-Strings gibt es seit Python 3.6. Sie werten Ausdrücke innerhalb der Ersetzungsfelder aus, sobald die Codezeile ausgeführt wird. Bei f"Alter im nächsten Jahr: {age + 1}" berechnet Python zuerst age + 1 und setzt dann die Summe in den Text ein.
Dynamische Formatvorlagen
Verschachtelte Ersetzungsfelder können Breite, Füllzeichen oder Ausrichtung aus einem anderen Wert übernehmen. Verwende diese Form, wenn diese Formatwerte erst zur Laufzeit feststehen.
# F-Strings mit einfacher Syntax
name, age = 'Alice', 25
print(f'{name} ist {age} Jahre alt') # Ausgabe: Alice ist 25 Jahre alt
print(f'Nächstes Jahr ist {name} {age + 1} Jahre alt') # Ausgabe: Nächstes Jahr ist Alice 26 Jahre alt
# Dynamische Formatvorlagen
value, width, fill, align = 'data', 12, '-', '^'
template = '|{val:{f}{a}{w}}|'
result = template.format(val=value, w=width, f=fill, a=align)
print(result) # Ausgabe: |----data----|
# Vergleich: gleiche Ausgabe mit unterschiedlichen Methoden
x = 123.456
print('Alter Stil: %8.2f' % x) # Ausgabe: Alter Stil: 123.46
print('Format-Methode: {0:8.2f}'.format(x)) # Ausgabe: Format-Methode: 123.46
print(f'F-string: {x:8.2f}') # Ausgabe: F-string: 123.46
# Komplexer F-String mit Formatangabe
import math
radius = 5.7
print(f'Fläche: {math.pi * radius**2:.2f} cm²') # Ausgabe: Fläche: 102.07 cm²Eine Formatspezifikation lesen
Probiere "{value:*^+10.2f}".format(value=12.3) aus. Die Ausgabe lautet **+12.30**. Der Typ f mit Präzision 2 erzeugt 12.30, das Pluszeichen ergänzt ein Zeichen, und vier Füllzeichen vervollständigen die Mindestbreite von zehn Zeichen. Die Ausrichtung ^ verteilt diese vier Füllzeichen gleichmäßig: zwei links und zwei rechts.
Die Formatierung erzeugt ein neues Stringobjekt. Die Zahl 12.3 bleibt unverändert. Du kannst sie weiterhin für eine andere Berechnung verwenden.