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

时间:2010-08-03 09:19:07

标签: python string syntax

我有一个看起来像'%s in %s'的字符串,我想知道如何分隔参数,使它们是两个不同的%s。我来自Java的想法提出了这个问题:

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

但这不起作用,所以它在Python中看起来如何?

8 个答案:

答案 0 :(得分:167)

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

但是从Python 2.6开始,您可以使用format代替%

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

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

  

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

答案 1 :(得分:110)

如果你使用多个参数,它必须是一个元组(注意额外的括号):

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

答案 2 :(得分:50)

在多个参数format

的元组/映射对象上

以下内容摘自文档:

  

鉴于format % values%中的format转换规范将替换为values的零个或多个元素。效果类似于在C语言中使用sprintf()

     

如果format需要单个参数,则值可以是单个非元组对象。 否则,值必须是具有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

另见

答案 3 :(得分:9)

您必须将值放入括号中:

p4 reopen

此处,对于第一个'%s in %s' % (unicode(self.author), unicode(self.publication)) %s将被放置。对于第二个unicode(self.author),将使用%s

  

注意:您应该优先于unicode(self.publication)符号string formatting。更多信息here

答案 4 :(得分:8)

到目前为止发布的一些答案存在严重问题: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字节(即[0; 127]中的值),而unicode()默认情况下从ASCII解码(在许多机器上)。

一个强大的解决方案是明确地给出字段中使用的编码;以UTF-8为例:

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

(或没有初始u,具体取决于您是想要Unicode结果还是字节串。)

此时,可能需要考虑将authorpublication字段设置为Unicode字符串,而不是在格式化期间解码它们。

答案 5 :(得分:5)

对于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)

答案 6 :(得分:4)

您也可以使用它干净简单(但错误!因为您应该像Mark Byers所说的那样使用format):

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

答案 7 :(得分:2)

为了完整性,PEP-498中引入了python 3.6 f-string。这些字符串可以使

  

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

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

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