我有一个看起来像'%s in %s'
的字符串,我想知道如何分隔参数,使它们是两个不同的%s。我来自Java的想法提出了这个问题:
'%s in %s' % unicode(self.author), unicode(self.publication)
但这不起作用,所以它在Python中看起来如何?
答案 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结果还是字节串。)
此时,可能需要考虑将author
和publication
字段设置为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}'