Python Strings mit .format()

Die Formatierung von Strings ist erstaunlich umfangreich. Wir wollen einen Überblick gewinnen. Eine komplette Einführung erscheint wegen dem Umfang als nicht zweckmäßig. Das Erlernen der String Formatierung ist mit viel Übung verbunden.

In Python gibt es 3 Wege um String Ausgaben zu formatieren.

study = 'KI'
year = 2019
print('Seit %d kann man %s an der JKU studieren!' % (year,study))
print('Seit {} kann man {} an der JKU studieren!'.format(year,study))
print(f'Seit {year} kann man {study} an der JKU studieren!')
Seit 2019 kann man KI an der JKU studieren!
Seit 2019 kann man KI an der JKU studieren!
Seit 2019 kann man KI an der JKU studieren!

Die erste Option ist die älteste und gilt mittlerweile veraltet. Diese Variante benutzt den % Operator um den String zu formatieren. Diese Variante wollen wir in diesem Buch nicht mehr benutzen.

print('Seit %d kann man %s an der JKU studieren!' % (year,study))
Seit 2019 kann man KI an der JKU studieren!

.format() ist mit Python 3.0 eingeführt worden und gilt seitdem als Standard.

print('Seit {} kann man {} an der JKU studieren!'.format(year,study))
Seit 2019 kann man KI an der JKU studieren!

Seit Python 3.6 gibt es die sogenannten f-strings welche sich als sehr praktische erwiesen haben. Ausgaben sind oft sehr gut lesbar.

print(f'Seit {year} kann man {study} an der JKU studieren!')
Seit 2019 kann man KI an der JKU studieren!

Warnung

Der % Operator für String Formatierung sollte nicht mehr verwendet werden.

Basis Formatierung

Mit der Methode .format() und dem Platzhalter können wir einfach Variablen in einem String einbauen.

var1='Eins'
var2='Zwei'
'{} vor {}'.format(var1, var2)
'Eins vor Zwei'

Wir können die Werte auch direkt der Methode übergeben.

'{} vor {}'.format('Eins', 'Zwei')
'Eins vor Zwei'

Wir können die Argumente vertauschen.

'{} vor {}'.format('Zwei', 'Eins')
'Zwei vor Eins'

Dieses Ergebnis können durch die Angaben {1} {0} erreichen.

'{1} vor {0}'.format('Zwei', 'Eins')
'Eins vor Zwei'

Wir können selbstverständlich auch Zahlen verwenden.

'{} vor {}'.format(1, 2)
'1 vor 2'
'{1} vor {0}'.format(1, 2)
'2 vor 1'

Zahlen

Die Formatierung von Strings ist insbesondere für Zahlen hilfreich.

'{:d}'.format(2022)
'2022'

Für float und complex Zahlen können wir {:f} verwenden.

'{:f}'.format(3.141592653589793)
'3.141593'

Standardmäßig werden 6 Nachkommastellen ausgegeben. Die Nachkommastellen x können wir {:.xf} steuern. Wir können diese auf zum Beispiel 3 beschränkten,

'{:.3f}'.format(3.141592653589793)
'3.142'

oder auf 9 erweitern.

'{:.9f}'.format(3.141592653589793)
'3.141592654'

Auch für die komplexe Zahlen können wir {:.xf} verwenden.

'{:.3f}'.format(1.1111+2.2222j)
'1.111+2.222j'

Zahlen auffüllen

Wollen wir Zahlen nach geordnet nach Dezimalstellen ausgeben, können wir das mit {:3} erreichen.

print('{:3}'.format(3))
print('{:3}'.format(33))
print('{:3}'.format(333))
  3
 33
333

Zusätzlich können wir den Datentyp angeben.

print('{:3d}'.format(3))
print('{:3d}'.format(33))
print('{:3d}'.format(333))
  3
 33
333

Ein Auffüllen mit 0 ist möglich.

print('{:03d}'.format(3))
print('{:03d}'.format(33))
print('{:03d}'.format(333))
003
033
333

Wir können nun in Kombination die Ausgaben von Zahlen float steuern.

print('{:04.2f}'.format(3.141592653589793))
print('{:05.2f}'.format(3.141592653589793))
print('{:06.2f}'.format(3.141592653589793))
3.14
03.14
003.14

Zahlen mit Vorzeichen

Manchmal ist es notwendig das Vorzeichen von Zahlen explizit darzustellen. Positive Zahlen werden ohne Vorzeichen ausgegeben.

'{}'.format(3)
'3'

Wenn wir ein + explizit ausgeben wollen können wir das mit {:+} erreichen.

'{:+}'.format(3)
'+3'

Das negative Vorzeichen wird automatisch ausgegeben.

'{}'.format((-3))
'-3'

Mit dem Muster {:=+5} können wir das Vorzeichen ganz am Anfang setzen.

'{:=+5}'.format(3)
'+   3'
'{:=5}'.format((-3))
'-   3'

Das Auffüllen mit 0 ist auch hier möglich und oft sinnvoll.

print('{:=+05}'.format(3))
print('{:=05}'.format(-3))
+0003
-0003

Auffüllen und Ausrichten von Zeichenketten

Mit <,>,^ ist ein steuern für das Auffüllen und das Ausrichten von Zeichenketten möglich.

Standardmäßig ist der Text nach links ausgerichtet und das Auffüllen erfolgt nach rechts.

'{:10}'.format('test')
'test      '

Mit {:>10} kann ein Text nach rechts ausgerichtet werden und das Auffüllen erfolgt nach links.

'{:>10}'.format('test')
'      test'

Wir können die Leerstellen auch mit anderen Zeichen auffüllen. Dazu nutzen wir das Muster {:x<10} mit dem Zeichen x.

'{:!<10}'.format('test')
'test!!!!!!'

Das Muster {:x<10} richtet den Text wieder rechts aus und füllt die Leerstellen mit dem Zeichen x auf.

'{:_>10}'.format('test')
'______test'

Auch ein Zentrieren des Textes ist möglich. Mit dem Muster {:x^10} können wir dies erreichen.

'{:!^10}'.format('test')
'!!!test!!!'
'{:_^7}'.format('zip')
'__zip__'

Lange Zeichenketten abschneiden

Das Abschneiden von Zeichenketten:

'{:.5}'.format('Mechatronik')
'Mecha'

Wir können das Abscheiden mit dem Auffüllen kombinieren.

'{:10.5}'.format('Mechatronik')
'Mecha     '

Wir können das Abscheiden und das Auffüllen mit der Ausrichtung kombinieren.

'{:>10.5}'.format('Mechatronik')
'     Mecha'

Benannte Platzhalter

Wir können den Platzhalter Werte zuweisen und so diese im String öfters verwenden.

'{last}, {first} {last}!'.format(first='James', last='Bond')
'Bond, James Bond!'

dict können elegant mit format() verwendet werden. Dabei werden die Schlüsselwörter als Platzhalter verwendet.

data = {'first': 'James', 'last': 'Bond'}
'{last}, {first} {last}!'.format(**data)
'Bond, James Bond!'

Zugriff auf Listen und mehr

Das gemeinsame Verwenden von komplexeren Datentypen mit .format() macht das String-Formatieren oft besonders einfach. Hier ist ein Beispiel mit list.

odd = [1, 2, 3, 7, 11, 13]
'{d[4]} {d[5]}'.format(d=odd)
'11 13'

Hier ist ein Beispiel mit dict.

person = {'first': 'James', 'last': 'Bond'}
'{p[first]} {p[last]}'.format(p=person)
'James Bond'

Ein Beispiel wie wir die .format() Methode gemeinsam mit einer selbstgeschriebenen Klasse verwenden können. Der String ist sehr gut lesbar.

class Car(object):
    name = 'Tesla'
    year = 2019
    price = {'black': 30000, 'blue': 35000}
    
print('Marke: {p.name} \nJahr: {p.year} \nPreis: {p.price[black]}'.format(p=Car()))
Marke: Tesla 
Jahr: 2019 
Preis: 30000

Datetime

Der Datetime Datentype ist für Zeitreihenanalysen von besonderer Bedeutung. Gerade gemeinsam mit Pandas ist dieser Datentype kaum zu überschätzen. Wir können auch die .format() verwenden um die Formatierung in einem String zu verändern.

from datetime import datetime
print(datetime(2001, 2, 3, 4, 5))
2001-02-03 04:05:00
'{:%Y-%m-%d %H:%M}'.format(datetime(2001, 2, 3, 4, 5))
'2001-02-03 04:05'
'{:%d-%m-%Y %H:%M}'.format(datetime(2001, 2, 3, 4, 5))
'03-02-2001 04:05'