python 为什么会出现“TypeError:字符串格式设置过程中未转换所有参数”尝试使用%替换占位符(如{0})?

yv5phkfx  于 2023-04-04  发布在  Python
关注(0)|答案(9)|浏览(226)

我有一些代码将从用户那里读取两个字符串:

name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")

稍后,我想将这些字符串格式化为更长的字符串以进行打印:

if len(name1) > len(name2):
    print ("'{0}' is longer than '{1}'"% name1, name2)

但我得到一个错误消息,看起来像:

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

这段代码有什么问题?我应该怎么写这一行,才能正确地格式化字符串?
另请参阅String formatting: % vs. .format vs. f-string literal以深入比较最常见的字符串格式化方法,以及How do I put a variable’s value inside a string (interpolate it into the string)?以了解这种字符串构造的一般操作指南。请参阅Printing tuple with string formatting in Python以了解另一个常见的错误原因。

lstz6jyr

lstz6jyr1#

旧式%使用%代码进行格式设置:

# 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)

新的{}使用{}代码和.format方法。确保不要混合和匹配-如果“模板”字符串包含{}占位符,则调用.format,不要使用%

# 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)
6tqwzwtp

6tqwzwtp2#

使用'%'运算符的传统字符串格式的正确方法是使用printf样式的格式字符串(此处的Python文档:http://docs.python.org/2/library/string.html#format-string-syntax):

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

但是,'%'运算符will probably be deprecated in the future。新的PEP 3101操作方式如下所示:

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

xtfmy6hx3#

trying to format a single value into the string using % , if the value is a tuple时也会导致此错误。
正如Alex Martelli的回答所示:

>>> thetuple = (1, 2, 3)
>>> print("this is a tuple: %s" % (thetuple,))
this is a tuple: (1, 2, 3)

创建一个单例元组,其中只包含感兴趣的元组,即(thetuple,)部分,这是这里的关键。

wqsoz72f

wqsoz72f4#

请记住,忘记引用变量也可能导致此错误

"this is a comment" % comment #ERROR

而不是

"this is a comment: %s" % comment
50pmv0ei

50pmv0ei5#

除了其他两个答案,我认为缩进在最后两个条件中也是不正确的。条件是一个名字比另一个长,他们需要以'elif'开头,并且没有缩进。如果你把它放在第一个条件内(通过从边缘给予它四个凹痕),它最终是矛盾的,因为名称的长度不能同时相等和不同。

else:
        print ("The names are different, but are the same length")
elif len(name1) > len(name2):
    print ("{0} is longer than {1}".format(name1, name2))
hpcdzsge

hpcdzsge6#

在python 3.7及更高版本中,有一种新的简单方法。它被称为f-strings。下面是语法:

name = "Eric"
age = 74
f"Hello, {name}. You are {age}."

输出:

Hello, Eric. You are 74.
mftmpeh8

mftmpeh87#

对我来说,由于我在一个print调用中存储了许多值,解决方案是创建一个单独的变量来将数据存储为元组,然后调用print函数。

x = (f"{id}", f"{name}", f"{age}")
print(x)
nhjlsmyf

nhjlsmyf8#

最简单的方法将字符串数字类型转换为整数

number=89
number=int(89)
gab6jxml

gab6jxml9#

我也遇到了错误,

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting

但是list args工作得很好。
我使用mysqlclient python库。库看起来不接受元组参数。传递列表参数,如['arg1', 'arg2']将工作。

相关问题