Warum erhalte ich “TypeError: not all arguments converted during string formatting” beim Versuch, einen Platzhalter wie {0} mit % zu ersetzen?

Lesezeit: 4 Minuten

Benutzeravatar von user2652300
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.

Benutzeravatar von nneonneo
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


Leonhs Benutzeravatar
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):

"'%s' is longer than '%s'" % (name1, name2)

Allerdings der ‘%’-Operator wird wohl in Zukunft abgeschafft. Das neue PEP 3101 Vorgehensweise ist so:

"'{0}' is longer than '{1}'".format(name1, name2)

  • scnr: “wird wahrscheinlich in Zukunft veraltet sein” ist bisher nicht passiert (Python 3.5). Die alte ‘%’-Syntax war nicht veraltet 3.1 und nur in 3.2 Das Protokollierungsmodul hat gelernt, wie man mit dem neuen Stil formatiert {}. Und plötzlich bringt 3,5 PEP 461: % Formatierung für Bytes. Das gibt mir zu denken % bleibt noch lange bestehen.

    – cfi

    7. Januar 2016 um 16:03 Uhr

  • % ist prägnanter. Schön, dass es bei uns bleibt.

    – Lenar Hoyt

    10. Juni 2016 um 10:36 Uhr

  • 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

Benutzeravatar von Nick Brady
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

Benutzeravatar von Tahir Musharraf
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

Benutzeravatar von azro
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

Benutzeravatar von sameer_nubia
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

1448750cookie-checkWarum erhalte ich “TypeError: not all arguments converted during string formatting” beim Versuch, einen Platzhalter wie {0} mit % zu ersetzen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy