x = " \{ Hello \} {0} "
print(x.format(42))
给我 : Key Error: Hello\\
我想打印输出: {Hello} 42
x = " \{ Hello \} {0} "
print(x.format(42))
给我 : Key Error: Hello\\
我想打印输出: {Hello} 42
Answers:
您需要将{{
和加倍}}
:
>>> x = " {{ Hello }} {0} "
>>> print(x.format(42))
' { Hello } 42 '
这是Python文档中有关格式字符串语法的相关部分:
格式字符串包含用花括号括起来的“替换字段”
{}
。花括号中不包含的所有内容均视为文字文本,该文本原样复制到输出中。如果需要在文字文本中包含大括号字符,可以通过加倍:{{
和来对其进行转义}}
。
"{{{0}}}".format(42)
!
"{ something { } {value}".format(42)
不起作用。
{0}
意思
{0}
指向的第一个参数.format()
。{0} {1} {2}
只要为赋予相同数量的参数,就可以打印多个值.format()
。有关更多示例,请参见docs.python.org/library/string.html#format-examples。
您可以通过将花括号加倍来逃脱它。
例如:
x = "{{ Hello }} {0}"
print(x.format(42))
OP写了这个评论:
我正在尝试出于某种目的格式化小型JSON,例如:
'{"all": false, "selected": "{}"}'.format(data)
获得类似{"all": false, "selected": "1,2"}
在处理JSON时经常会出现“转义括号”问题。
我建议这样做:
import json
data = "1,2"
mydict = {"all": "false", "selected": data}
json.dumps(mydict)
它比替代方案更清洁,替代方案是:
'{{"all": false, "selected": "{}"}}'.format(data)
json
当JSON字符串比示例复杂时,最好使用该库。
如果您打算做很多事情,最好定义一个实用函数,让您使用任意大括号替代项,例如
def custom_format(string, brackets, *args, **kwargs):
if len(brackets) != 2:
raise ValueError('Expected two brackets. Got {}.'.format(len(brackets)))
padded = string.replace('{', '{{').replace('}', '}}')
substituted = padded.replace(brackets[0], '{').replace(brackets[1], '}')
formatted = substituted.format(*args, **kwargs)
return formatted
>>> custom_format('{{[cmd]} process 1}', brackets='[]', cmd='firefox.exe')
'{{firefox.exe} process 1}'
请注意,这将适用于括号为长度为2的字符串或两个字符串为可迭代的字符串(对于多字符定界符)。
我最近遇到了这个问题,因为我想将字符串注入预先格式化的JSON中。我的解决方案是创建一个辅助方法,如下所示:
def preformat(msg):
""" allow {{key}} to be used for formatting in text
that already uses curly braces. First switch this into
something else, replace curlies with double curlies, and then
switch back to regular braces
"""
msg = msg.replace('{{', '<<<').replace('}}', '>>>')
msg = msg.replace('{', '{{').replace('}', '}}')
msg = msg.replace('<<<', '{').replace('>>>', '}')
return msg
然后,您可以执行以下操作:
formatted = preformat("""
{
"foo": "{{bar}}"
}""").format(bar="gas")
如果性能不成问题,则完成工作。
原因是,{}
是.format()
您的情况下的语法,因此.format()
无法识别,{Hello}
因此引发了错误。
您可以使用双大括号{{}}覆盖它,
x = " {{ Hello }} {0} "
要么
尝试%s
格式化文本,
x = " { Hello } %s"
print x%(42)
我在尝试打印文本时偶然发现了这个问题,可以将其复制粘贴到Latex文档中。我扩展这个答案,并使用命名的替换字段:
假设您要打印出带有诸如的索引的多个变量的乘积
,在Latex中将是$A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$
这样的代码。以下代码使用命名字段完成工作,因此对于许多索引而言,它仍然可读:
idx_mapping = {'i1':42, 'i2':3141, 'i3':2178 }
print('$A_{{ {i1:04d} }} * A_{{ {i2:04d} }} * A_{{ {i3:04d} }} * A_{{ {i1:04d} }}$'.format(**idx_mapping))
如果你想只打印一个大括号(例如{
),您可以使用{{
,如果你愿意,你可以在后面的字符串添加多个支架。例如:
>>> f'{{ there is a curly brace on the left. Oh, and 1 + 1 is {1 + 1}'
'{ there is a curly brace on the left. Oh, and 1 + 1 is 2'