在Python中使用多个string格式参数(例如'%s …%s')
我有一个string,看起来像'%s in %s'
,我想知道如何分离的论点,使他们是两个不同的%s。 我的思想来自Java提出了这个:
'%s in %s' % unicode(self.author), unicode(self.publication)
但是这不起作用,所以它在Python中看起来如何?
Mark Cidade的答案是正确的 – 你需要提供一个元组。
但是从Python 2.6开始,你可以使用format
来代替%
:
'{0} in {1}'.format(unicode(self.author,'utf-8'), unicode(self.publication,'utf-8'))
不再鼓励使用%
来格式化string。
这种string格式化方法是Python 3.0中的新标准,应该优先于新代码中string格式化操作中描述的%格式。
如果你使用多个参数,它必须在一个元组中(注意多余的括号):
'%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'))
在多元参数format
的元组/映射对象上
以下摘自文档:
给定
format % values
,format
中的%
转换规格将被replace为零个或多个values
元素。 效果与在C语言中使用sprintf()
类似。如果
format
需要单个参数,则值可能是单个非元组对象。 否则,值必须是与format
string 或单个映射对象 (例如字典) 指定的项目数完全相同的元组 。
参考
- docs.python.org/library/stdtypes – string格式
在str.format
而不是%
%
运算符的更新选项是使用str.format
。 以下是文档摘录:
str.format(*args, **kwargs)
执行string格式化操作。 调用此方法的string可以包含由大括号
{}
分隔的文本文本或replace字段。 每个replace字段包含位置参数的数字索引或关键字参数的名称。 返回string的副本,其中每个replace字段被相应参数的string值replace。这个方法是Python 3.0中的新标准,应该优先于
%
格式 。
参考
- docs.python.org/library/stdtypes –
str.format
– 语法
例子
以下是一些用法示例:
>>> '%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
也可以看看
- docs.python.org/library/string – 格式示例
到目前为止发布的一些答案存在一个重大问题: unicode()
从默认编码(通常是ASCII unicode()
解码; 实际上, 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解码。
一个可靠的解决scheme是明确地给你的领域使用的编码; 以UTF-8为例:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(或没有最初的u
,取决于你是否想要一个Unicode结果或一个字节string)。
此时,可能要考虑将author
和publication
字段设置为Unicodestring,而不是在格式化时对其进行解码。
你也可以使用干净简单的(但错误的!因为你应该使用像马克·拜尔斯说的format
)通过做:
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)”。
对于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)