在Python中使用多个参数进行字符串格式化(例如,'%s ... %s')

205 投票
8 回答
363679 浏览
提问于 2025-04-16 02:14

我有一个字符串,看起来像 '%s in %s',我想知道怎么把里面的参数分开,让它们变成两个不同的 %s。因为我之前用的是Java,所以我想到了这个方法:

'%s in %s' % unicode(self.author),  unicode(self.publication)

但是这个方法不管用,那在Python里应该怎么写呢?

8 个回答

70

关于元组/映射对象用于多个参数的 format

以下是文档中的摘录:

format % values 中,% 转换说明会用 values 中的零个或多个元素来替换 format 中的内容。这个效果类似于在C语言中使用 sprintf()

如果 format 只需要一个参数,values 可以是一个单独的非元组对象。否则,values 必须是一个元组,里面的元素数量必须和 format 字符串中指定的数量完全一致,或者是一个单独的映射对象(比如字典)。

参考资料


关于使用 str.format 而不是 %

一个更新的替代方法是使用 str.format。以下是文档中的摘录:

str.format(*args, **kwargs)

执行字符串格式化操作。调用这个方法的字符串可以包含普通文本或用大括号 {} 括起来的替换字段。每个替换字段可以包含一个位置参数的数字索引,或者一个关键字参数的名称。返回一个字符串副本,其中每个替换字段都被对应参数的字符串值替换。

这个方法是Python 3.0中的新标准,应该优先使用 % 格式化。

参考资料


示例

以下是一些使用示例:

>>> '%s for %s' % ("tit", "tat")
tit for tat

>>> '{} and {}'.format("chicken", "waffles")
chicken and waffles

>>> '%(last)s, %(first)s %(last)s' % {'first': "James", 'last': "Bond"}
Bond, James Bond

>>> '{last}, {first} {last}'.format(first="James", last="Bond")
Bond, James Bond

另见

144

如果你使用多个参数,它们必须放在一个元组里(注意多了一个括号):

'%s in %s' % (unicode(self.author),  unicode(self.publication))

正如EOL所提到的,unicode()这个函数通常默认使用ascii编码,所以如果你有非ASCII字符,最好明确指定编码方式:

'%s in %s' % (unicode(self.author,'utf-8'),  unicode(self.publication('utf-8')))

而从Python 3.0开始,推荐使用str.format()的写法:

'{0} in {1}'.format(unicode(self.author,'utf-8'),unicode(self.publication,'utf-8'))
226

Mark Cidade的回答是对的 - 你需要提供一个元组。

不过从Python 2.6开始,你可以用format来代替%

'{0} in {1}'.format(unicode(self.author,'utf-8'),  unicode(self.publication,'utf-8'))

现在不再推荐使用%来格式化字符串了。

这种字符串格式化的方法在Python 3.0中成为了新的标准,新的代码中应该优先使用这种方法,而不是之前的%格式化。

撰写回答