x = " \{ Hello \} {0} "
print(x.format(42))
дает мне : Key Error: Hello\\
Я хочу напечатать вывод: {Hello} 42
{{ }}
), используйте string.Template
. Там вы подставляете идентификаторы формы $foo
(удобно для генерации кода LaTeX).
x = " \{ Hello \} {0} "
print(x.format(42))
дает мне : Key Error: Hello\\
Я хочу напечатать вывод: {Hello} 42
{{ }}
), используйте string.Template
. Там вы подставляете идентификаторы формы $foo
(удобно для генерации кода LaTeX).
Ответы:
Вам нужно удвоить {{
и }}
:
>>> 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))
Python 3.6+ (2017)
В последних версиях Python можно использовать f-строки (см. Также PEP498 ).
С f-струнами следует использовать двойной {{
или}}
n = 42
print(f" {{Hello}} {n} ")
производит желаемое
{Hello} 42
Если вам нужно разрешить выражение в скобках вместо использования литерального текста, вам понадобится три набора скобок:
hello = "HELLO"
print(f"{{{hello.lower()}}}")
производит
{hello}
ОП написал этот комментарий:
Я пытался отформатировать небольшой 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 становится более сложной, чем в примере.
Хотя не лучше, просто для справки, вы также можете сделать это:
>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42
Это может быть полезно, например, когда кто-то хочет напечатать {argument}
. Это может быть более читабельным, чем'{{{}}}'.format('argument')
Обратите внимание, что вы опускаете позиции аргументов (например, {}
вместо {0}
) после Python 2.7
Если вы собираетесь делать это много, было бы неплохо определить вспомогательную функцию, которая позволит вам вместо этого использовать произвольные заменители скобок, например
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 $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'
Когда вы просто пытаетесь интерполировать строки кода, я бы предложил использовать jinja2, который является полнофункциональным механизмом шаблонов для Python, то есть:
from jinja2 import Template
foo = Template('''
#include <stdio.h>
void main() {
printf("hello universe number {{number}}");
}
''')
for i in range(2):
print(foo.render(number=i))
Таким образом, вы не будете вынуждены дублировать фигурные скобки, как целая куча других ответов
Вы можете сделать это, используя метод необработанной строки, просто добавив символ «r» без кавычек перед строкой.
# to print '{I am inside braces}'
print(r'{I am inside braces}')
\{I am inside braces\}
.