Python / str() / Objekte in Zeichenketten umwandeln

Pythons str() liefert eine lesbare Zeichenkettendarstellung eines Objekts. Verwenden Sie es etwa zum Verbinden von Zahlen und Text oder zum Speichern einer Textdarstellung; der Typ des ursprünglichen Objekts wird dadurch nicht geändert. Bytes zu decodieren oder JSON zu erzeugen erfordert dagegen eine zum Zweck passende Operation.

Grundform und Rückgabetyp prüfen

str(object) liefert ein str-Objekt, beispielsweise für Zahlen und boolesche Werte. Ohne Argument ergibt str() eine leere Zeichenkette. Meist wird die Darstellung aus __str__() verwendet, die eigene Klassen definieren können. Die unterstützten Formen beschreibt die offizielle str-Typreferenz.

Die Beispiele benötigen nur Python 3 und die Standardbibliothek. Speichern Sie das vollständige Programm als UTF-8 in str_example.py und starten Sie python str_example.py im Terminal. Manche Umgebungen verwenden python3. Spätere Beispiele sind ebenfalls eigenständig: Ersetzen Sie den Dateiinhalt und führen Sie ihn erneut aus.

number = 42
text = str(number)
print(number, type(number).__name__)
print(text, type(text).__name__)
print("ID-" + text)
print(repr(str()))
print(str(None))

Erwartete Ausgabe:

42 int
42 str
ID-42
''
None

Beide Werte erscheinen als 42, haben aber verschiedene Typen. number bleibt eine Ganzzahl, während text eine Zeichenkette ist. Das mit repr() gezeigte '' hat Länge null. str(None) erzeugt dagegen den Text None.

Umwandlung und Zahlenformatierung unterscheiden

str() verwendet die grundlegende Zahlendarstellung und legt weder Nachkommastellen noch ein Währungsformat fest. Für eine feste Anzeige, etwa zwei Nachkommastellen, eignet sich eine formatierte Zeichenkette wie ein f-String.

price = 12.5
print(str(price))
print(f"{price:.2f}")
print("price=" + str(price))
12.5
12.50
price=12.5

12.50 ist eine mit zwei Nachkommastellen dargestellte Zeichenkette. Der ursprüngliche Wert price bleibt unverändert. Rundung zur Anzeige und die Genauigkeit der Berechnung sind verschiedene Fragen.

Bytes für Text decodieren

bytes enthält Bytedaten, str Unicode-Text. Ein bloßes str(raw) ergibt die Darstellung des Bytes-Objekts. Für die ursprünglichen Zeichen müssen Sie die tatsächliche Codierung in decode() oder str(raw, encoding) angeben.

raw = "café".encode("utf-8")
print(str(raw))
print(raw.decode("utf-8"))
print(str(raw, "utf-8"))
b'caf\xc3\xa9'
café
café

Das Präfix b und die Backslash-Sequenzen der ersten Zeile stellen Bytes dar. Erst die nächsten beiden Zeilen decodieren sie als UTF-8. Wurde die Datei oder Antwort anders codiert, verwenden Sie deren Codierung. errors="ignore" kann Daten verwerfen und sollte nicht nur zum Verbergen eines Fehlers eingesetzt werden.

str(), repr() oder JSON passend auswählen

str() dient vor allem der lesbaren Anzeige, repr() der Untersuchung einer Objektdarstellung beim Entwickeln. Auch repr() garantiert nicht für jedes Objekt rekonstruierbaren Code. Für Datenaustausch erzeugen Sie mit json.dumps() JSON, JavaScript Object Notation, ein standardisiertes Textdatenformat.

import json

data = {"active": True, "count": 0}
print(str(data))
print(json.dumps(data))
print(str("hello\nworld"))
print(repr("hello\nworld"))
{'active': True, 'count': 0}
{"active": true, "count": 0}
hello
world
'hello\nworld'

Die str()-Darstellung des Dictionary verwendet Python-Anführungszeichen und True und ist daher nicht automatisch JSON. Ein Zeilenumbruch wird bei der Ausgabe über str() tatsächlich umgebrochen, während repr() eine Escape-Darstellung wie \n zeigt.

Nur None durch leeren Text ersetzen

Soll nur der fehlende Wert None leer werden, prüfen Sie mit is None. str(value or "") macht auch aus 0 und False leeren Text und kann damit deren Bedeutung verlieren.

for value in (None, 0, False):
    text = "" if value is None else str(value)
    print(repr(text))
''
'0'
'False'

Verkettungs- und Decodierungsfehler behandeln

Direktes + zwischen Zeichenkette und Zahl führt zu TypeError. Wandeln Sie die Zahl mit str() um oder verwenden Sie einen f-String. Nicht mit der gewählten Codierung lesbare Bytes führen zu UnicodeDecodeError; prüfen Sie Originalcodierung und Vollständigkeit der Daten.

try:
    print("ID-" + 42)
except TypeError:
    print("TypeError")

try:
    str(b"\xff", "utf-8")
except UnicodeDecodeError:
    print("UnicodeDecodeError")
TypeError
UnicodeDecodeError

Das letzte Beispiel fängt Ausnahmen ab, um deren Typ zu zeigen. Eine Umwandlung kann auch scheitern, wenn ein eigenes __str__() einen falschen Typ zurückgibt oder intern eine Ausnahme auslöst. Nicht jeder Fehler ist deshalb eine fehlerhafte Verkettung.