我有一些代码可以从用户那里读取两个字符串:
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
代码出了什么问题?我应该如何写这行,以便正确格式化字符串?
请参阅字符串格式设置:%与.format与f-String文本,以深入比较最常见的字符串格式设置方法,以及如何将变量的值放入字符串中(将其插入字符串中)?获取这种字符串构造的一般操作指南。有关错误的另一个常见原因,请参阅在Python中使用字符串格式打印元组
旧式%
格式化使用%
代码进行格式化:
# 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)
使用"%"运算符使用传统字符串格式的正确方法是使用printf样式的格式字符串(此处的Python文档:http://docs.python.org/2/library/string.html#format-字符串语法):
"'%s' is longer than '%s'" % (name1, name2)
但是,"%"运算符将来可能会被弃用。新的PEP 3101做事方式是这样的:
"'{0}' is longer than '{1}'".format(name1, name2)
如果单个值是元组,则尝试使用%
将其格式化为字符串时也会导致此错误。
正如Alex Martelli的回答所示和解释的那样:
>>> thetuple = (1, 2, 3)
>>> print("this is a tuple: %s" % (thetuple,))
this is a tuple: (1, 2, 3)
以感兴趣的元组作为唯一项来制作单例元组,即
(thetuple,)
部分是这里的关键比特。
请记住,此错误也可能是由于忘记引用变量引起的
"this is a comment" % comment #ERROR
而不是
"this is a comment: %s" % comment
在python 3.7及以上版本中,有一种新的简单方法。它被称为f字符串。语法如下:
name = "Eric"
age = 74
f"Hello, {name}. You are {age}."
输出:
Hello, Eric. You are 74.
对我来说,因为我在一个打印调用中存储了许多值,所以解决方案是创建一个单独的变量,将数据存储为元组,然后调用打印函数。
x = (f"{id}", f"{name}", f"{age}")
print(x)
最简单的方法将字符串编号转换为整数
number=89
number=int(89)
我也遇到了错误,
_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting
但列表参数运行良好。
我使用mysqlclient python库。lib看起来不接受元组参数。传递列表参数(如['arg1', 'arg2']
)将起作用。