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

我有一个字符串,看起来像'%s in %s',我想知道如何分隔参数,使它们成为两个不同的%s.我从Java想到了这个:

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

但这不起作用,那么它在Python中看起来如何呢?

333813 次浏览

如果使用多个参数,则必须在元组中(注意额外的括号):

'%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')))

从Python3.0开始,最好使用str.format()语法:

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

在多参数format的元组/映射对象上

以下是文档的摘录:

给定format % valuesformat中的%转换规范被values的零个或多个元素替换。其效果类似于在C语言中使用sprintf()

如果format需要单个参数,则值可以是单个非元组对象。否则,值必须是具有format字符串所指定的确切项数的元组。或单个映射对象(例如,字典)。

参考文献


str.format而不是%

%运算符的更新替代方法是使用str.format。以下是文档的摘录:

str.format(*args, **kwargs)

执行字符串格式化操作。调用此方法的字符串可以包含文本或替换字段,由{}的大括号分隔。每个替换字段都包含位置参数的数字索引或关键字参数的名称。返回字符串的副本,其中每个替换字段都替换为相应参数的字符串值。

这种方法是Python3.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

另请参阅

Mark Cidade的回答是正确的-您需要提供一个元组。

但是,从Python2.6开始,您可以使用format代替%

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

不再鼓励使用%来格式化字符串。

这种字符串格式化方法是Python3.0中的新标准,应该优先于新代码中的字符串格式化操作中描述的%格式化。

对于Python2,您也可以这样做。

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

如果你有很多论据可以替代(特别是如果你正在进行国际化),这是很方便的。

Python2.6以上版本支持.format()

'{author} in {publication}'.format(author=self.author,
publication=self.publication)

到目前为止,发布的一些答案存在一个重大问题:unicode()从默认编码(通常是ASCII)解码;事实上,unicode()试图通过将字节转换为字符来“理解”给定的字节。因此,下面的代码(实际上是前面的答案所推荐的)在我的机器上失败了:

# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))

给予:

Traceback (most recent call last):
File "test.py", line 3, in <module>
print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

失败是由于author不只包含ASCII字节(即,127]),并且unicode()默认从ASCII解码(在许多机器上)。

一个健壮的解决方案是显式地给出字段中使用的编码。以UTF-8为例:

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

(或者不使用初始u,具体取决于您需要Unicode结果还是字节字符串)。

此时,可以考虑使authorpublication字段为Unicode字符串,而不是在格式化期间对它们进行解码。

你也可以使用它干净和简单(但错了!因为您应该通过执行以下操作来使用_ABC(_0,如Mark Byers所说):

print 'This is my %s formatted with %d arguments' % ('string', 2)

您必须将值放入括号中:

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

这里,对于第一%s,将放置unicode(self.author)。并且对于第二%s,将使用unicode(self.publication)

注:应优先使用string formatting,而不是%表示法。更多信息在这里

为完整起见,在Python 3.6中,在PEP-498中引入了F-String.这些字符串使得有可能

使用最少的语法将表达式嵌入到字符串文字中。

这意味着对于您的示例,您还可以使用:

f'{self.author} in {self.publication}'