Warum erhalte ich “TypeError: not all arguments converted during string formatting” beim Versuch, einen Platzhalter wie {0} mit % zu ersetzen?
Lesezeit: 4 Minuten
Benutzer2652300
Ich habe einen Code, der zwei Zeichenfolgen vom Benutzer liest:
name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")
Später möchte ich diese Zeichenfolgen zum Drucken in eine längere Zeichenfolge formatieren:
if len(name1) > len(name2):
print ("'{0}' is longer than '{1}'"% name1, name2)
Aber ich bekomme eine Fehlermeldung, die so aussieht:
Traceback (most recent call last):
File "program.py", line 13, in <module>
print ("'{0}' is longer than '{1}'"% name1, name2)
TypeError: not all arguments converted during string formatting
Was ist mit dem Code falsch? Wie soll ich stattdessen diese Zeile schreiben, um die Zeichenfolge richtig zu formatieren?
Siehe auch Zeichenfolgenformatierung: % vs. .format vs. f-string literal für einen ausführlichen Vergleich der gebräuchlichsten Möglichkeiten, diese Art der Zeichenfolgenformatierung durchzuführen, und Wie füge ich den Wert einer Variablen in eine Zeichenfolge ein (interpoliere ihn in die Schnur)? für eine allgemeine Anleitung für diese Art von Saitenkonstruktion. Weitere häufige Fehlerursachen finden Sie unter Drucken von Tupeln mit Zeichenfolgenformatierung in Python.
nneonneo
Alter Stil % Formatierung verwendet % Codes für die Formatierung:
# A single value can be written as is:
'It will cost $%d dollars.' % 95
# Multiple values must be provided as a tuple:
"'%s' is longer than '%s'" % (name1, name2)
Neuer Stil {} Formatierung verwendet {} Codes und die .format Methode. Achten Sie darauf, nicht zu mischen und anzupassen – wenn die Zeichenfolge “Vorlage” enthält {} Platzhalter, dann aufrufen .formatnicht verwenden %.
# The values to format are now arguments for a method call,
# so the syntax is the same either way:
'It will cost ${0} dollars.'.format(95)
"'{0}' is longer than '{1}'".format(name1, name2)
in Python 3.6: f"'It will cost ${your_variable} dollars."
– JinSchnee
22. März 2017 um 20:18 Uhr
Ergänzung zu @JinSnow-Kommentar.. wenn Sie möchten, dass der Variablenname auch gedruckt wird, f"'It will cost {your_variable=} dollars."
– Sam Daniel
9. November 2021 um 9:56 Uhr
Leonh
Die korrekte Methode zur Verwendung der traditionellen Zeichenfolgenformatierung mit dem Operator „%“ besteht darin, eine Formatzeichenfolge im printf-Stil zu verwenden (Python-Dokumentation dazu hier: http://docs.python.org/2/library/string.html#format-string-syntax):
Ich stimme zu. % ist prägnanter und das Entfernen würde der Sprache keinen Vorteil bringen.
– chevydog
26. Dezember 2017 um 16:13 Uhr
@LenarHoyt Wie denkst du über F-Saiten? Das kann ich mir nicht vorstellen "'%s' is longer than '%s'" % (name1, name2) prägnanter als f"'{name1}' is longer than '{name2}'"
– Markus Moretto
16. Januar 2020 um 12:34 Uhr
Ich bin total für F-Saiten, aber sie sind zu neu und Sie können sie nicht für Projekte verwenden, die älter als ein Jahr sind
– Darko Kolev
29. September 2020 um 11:27 Uhr
Nick Brady
Dieser Fehler wird auch verursacht, wenn versucht wird, einen einzelnen Wert mithilfe von in die Zeichenfolge zu formatieren %wenn der Wert ein Tupel ist.
Wie in Alex Martellis Antwort dort gezeigt und erklärt:
>>> thetuple = (1, 2, 3)
>>> print("this is a tuple: %s" % (thetuple,))
this is a tuple: (1, 2, 3)
Erstellen eines Singleton-Tupels mit dem interessierenden Tupel als einzigem Element, dh dem (thetuple,) Teil, ist hier das Schlüsselbit.
Ich würde das Tupel lieber mit einer der folgenden Anweisungen in einen String konvertieren: print("this is a tuple: %s" % str(thetuple)) oder print("this is a tuple: %s" % repr(thetuple))
– Alex
7. März 2017 um 6:56 Uhr
Beachten Sie, dass dieser Fehler auch dadurch verursacht werden kann, dass vergessen wird, auf die Variable zu verweisen
"this is a comment" % comment #ERROR
anstatt
"this is a comment: %s" % comment
Tahir Musharraf
In Python 3.7 und höher gibt es einen neuen und einfachen Weg. Es heißt F-Saiten. Hier ist die Syntax:
name = "Eric"
age = 74
f"Hello, {name}. You are {age}."
Ausgang:
Hello, Eric. You are 74.
Dies beantwortet die Frage nicht wirklich.
– pp
27. Juni 2022 um 18:29 Uhr
Azro
Da ich viele Werte in einem einzigen Druckaufruf gespeichert habe, bestand die Lösung für mich darin, eine separate Variable zu erstellen, um die Daten als Tupel zu speichern und dann die Druckfunktion aufzurufen.
x = (f"{id}", f"{name}", f"{age}")
print(x)
Dies beantwortet die Frage nicht wirklich.
– pp
27. Juni 2022 um 18:29 Uhr
sameer_nubia
Der einfachste Weg, die Zeichenfolgennummer in eine Ganzzahl umzuwandeln
number=89
number=int(89)
Dies bezieht sich auf ein nicht verwandtes Problem. Siehe zB stackoverflow.com/questions/15496408.
– Karl Knechtel
4. April um 0:39
14487500cookie-checkWarum erhalte ich “TypeError: not all arguments converted during string formatting” beim Versuch, einen Platzhalter wie {0} mit % zu ersetzen?yes