Python Strings mit str.format()

Python
Autor:in

Johannes Kaisinger

Veröffentlichungsdatum

5. November 2021

Im letzten Blogeintrag haben wir die print() Funktion kennengelernt. Python besitzt mit str.format() eine elegante Möglichkeit, Strings mit Variablen zu kombinieren und zu formatieren.

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.

Python String Formatierung für die Ausgabe

In Python gibt es drei Wege um String Ausgaben zu formatieren: - % Operator => Gilt als veraltet - str.format() PEP3101 => Eingeführt mit Python 2.6 - f-stringsPEP498 => Eingeführt mit Python 3.6

study = 'KI'
year = 2019
print('Seit %d ist ein %s-Studium an der JKU möglich!' % (year,study))
print('Seit {} ist ein {}-Studium an der JKU möglich!'.format(year,study))
print(f'Seit {year} ist ein {study}-Studium an der JKU möglich!')
Seit 2019 ist ein KI-Studium an der JKU möglich!
Seit 2019 ist ein KI-Studium an der JKU möglich!
Seit 2019 ist ein KI-Studium an der JKU möglich!

Die erste Option benutzt den % Operator, ist die Älteste, gilt mittlerweile veraltet, und sollte nicht mehr verwendet werden.

print('Seit %d ist ein %s-Studium an der JKU möglich!' % (year,study))
Seit 2019 ist ein KI-Studium an der JKU möglich!

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

print('Seit {} ist ein {}-Studium an der JKU möglich!'.format(year,study))
Seit 2019 ist ein KI-Studium an der JKU möglich!

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

print(f'Seit {year} ist ein {study}-Studium an der JKU möglich!')
Seit 2019 ist ein KI-Studium an der JKU möglich!

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

Tipp

Im Folgenden wird der Platzhalter [x] für konkrete Zahlen verwendet. Im Code muss also [x] durch Zahlen ersetzt werden. Diese Schreibweise wird auch oft in der Pythondokumentation verwendet.

Basis Formatierung

Wie wir sehen, erhalten wir mit der str.format() Methode einen formatierten String, der sich in einer Variable abspeichern lässt.

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

Es handelt sich um eine Klassenmethode der String Klasse. Wir können also das Code Muster str(str_instance).format() verwenden.

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

Mit der Methode .format() und dem Platzhalter lassen sich Variablen einfach in einem String einbauen.

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

Weiters ist die direkte Übergabe von Werten, also ohne Variablen möglich.

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

Das Verwenden von Zahlen {1} {0} erlaubt die Position im String zu steuern. Dabei können diese Zahlen auch mehrfach angegeben werden.

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

Zahlen in Strings einbauen

Wir können selbstverständlich auch Zahlen verwenden.

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

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

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

Für float und complex Zahlen steht uns das Muster {:f} zur Verfügung.

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

Standardmäßig werden 6 Nachkommastellen ausgegeben. Die Nachkommastellen lassen sich mit [x] in {:.[x]f} steuern. Wir können die Nachkommastellen auf zum Beispiel 3 beschränkten,

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

oder auf 9 erweitern.

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

Auch komplexe Zahlen können {:.[x]f} so formatiertet werden.

'{:.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 {:[x]} erreichen.

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

Zusätzlich lässt sich der Datentyp angeben.

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

Auch ein Auffüllen mit 0 ist möglich, was zum Beispiel für Steuerkonten in der Buchhaltung hilfreich sein kann.

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

float Zahlen lassen sich nun wie folgt steuern. Mit .[x]f wird die Anzahl der Nachkommazahlen definiert. Die Zahl und die definierten Nachkommazahlen werden nun in jedem Fall ausgegeben.

print('{:01.2f}'.format(3.141592653589793))
print('{:02.2f}'.format(13.141592653589793))
print('{:03.2f}'.format(113.141592653589793))
3.14
13.14
113.14

Mit der Zahl vor dem Punkt . können wir wieder das Auffüllen steuern. Diese Zahl bedeutet hier die Gesamtanzahl der Zeichen, also Vorkomma, Punkt und Nachkomma.

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, der nicht benötigte Bereich wird aufgefüllt.

'{:=+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

Das Auffüllen und das Ausrichten von Zeichenketten kann mit den Zeichen <,>,^ gesteuert werden.

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 Platzhalter [x].

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

Das Muster {:[x]<10} richtet den Text wieder rechts aus und füllt die Leerstellen mit dem Platzhalter [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'

Das Abscheiden lässt sich mit dem Auffüllen kombinieren.

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

Auch die Ausrichtung kann wieder geändert werden.

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

Benannte Platzhalter

Platzhalter erlauben die Mehrfachverwendung von Variablen in Strings.

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

Wörterbücher (dict) können elegant mit .format() verwendet werden. Dabei werden die Schlüsselwörter (keys) 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'

Ein anderes 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 einerselbstgeschriebenen Klasse verwenden können.

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

Das print-Statement bzw. der Ausgabe-String ist sehr gut lesbar.

Datetime

Der Datetime-Datentyp 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'

Fazit

Mit str.format() lassen sich Strings in verschiedensten Weisen formatieren. Dabei haben wir das Thema hier nur angerissen. Eine komplette Einführung, erscheint wegen des Umfangs, als nicht zweckmäßig.

Im nächsten Blogeintrag wollen wir die String-Formatierung mittels f-strings besprechen. Für einfache Ausgaben sind f-strings sehr nützlich und die Syntax lässt sich leicht lernen.