Как я могу напечатать буквенные фигурные скобки в строке Python, а также использовать.format на нем?

x = " \{ Hello \} {0} "
print x.format(42)

дает мне: Key Error: Hello\\

Я хочу напечатать вывод: {Hello} 42

27 ответов

Решение

Вам нужно удвоить {{ а также }}:

>>> x = " {{ Hello }} {0} "
>>> print x.format(42)
' { Hello } 42 '

Вот соответствующая часть документации по Python для синтаксиса строки формата:

Строки формата содержат "замещающие поля", заключенные в фигурные скобки {}, Все, что не содержится в фигурных скобках, считается буквальным текстом, который копируется без изменений в выходные данные. Если вам нужно включить символ скобки в буквальный текст, его можно избежать путем удвоения: {{ а также }},

Python 3.6+ (2017)

В последних версиях Python можно использовать f-строки (см. Также PEP498).

С f-струнами нужно использовать двойной {{ или же }}

n = 42  
print(f" {{Hello}} {n} ")

производит желаемое

 {Hello} 42

Если вам нужно разрешить выражение в скобках вместо использования литерального текста, вам понадобится три набора скобок:

hello = "HELLO"
print(f"{{{hello.lower()}}}")

производит

{hello}

Вы избегаете этого, удваивая скобки.

Например:

x = "{{ Hello }} {0}"
print x.format(42)

Вы хотите отформатировать строку с помощью символа или

Вам просто нужно их удвоить.

формат { с участием f'{{' а также }с участием f'}}'

Так :

      name = bob
print(f'Hello {name} ! I want to print }} and {{')

Выход :

Привет, боб! Я хочу напечатать} и {

ОП написал этот комментарий:

I was trying to format a small JSON for some purposes, like this: '{"all": false, "selected": "{}"}'.format(data) to get something like {"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 }} {0}"

Попробуйте сделать это:

x = " {{ Hello }} {0} "
print x.format(42)

Хотя не лучше, просто для справки, вы также можете сделать это:

>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42

Это может быть полезно, например, когда кто-то хочет напечатать {argument}, Это может быть более читабельным, чем '{{{}}}'.format('argument')

Обратите внимание, что вы опускаете позиции аргументов (например, {} вместо {0}) после Python 2.7

f-строки (Python 3)

Вы можете избежать удвоения фигурных скобок, используя f-строки только для тех частей строки, к которым вы хотите применить f-magic, и используя обычные строки для всего, что является буквальным. Позвольте python выполнить соединение строк за вас, просто сложив несколько строк вместе.

      number = 42
print(" { Hello }"  
f" {number} " 
"{ thanks for all the fish }")

### OUTPUT:
{ Hello } 42 { thanks for all the fish }

ПРИМЕЧАНИЕ. Разрывы строк не требуются. Я поставил их только для того, чтобы было удобнее читать. Вы могли бы также написать это как "{Hello}"f"{number}".

      key = "FOOBAR"
print(f"hello {{{key}}}")

выходы

      hello {FOOBAR}

На случай, если кто-то захочет напечатать что-то внутри фигурных скобок, используя fstrings.

Если вам нужно сохранить в строке две фигурные скобки, вам понадобится по 5 фигурных скобок с каждой стороны переменной.

>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'

Если вы собираетесь делать это много, было бы неплохо определить вспомогательную функцию, которая позволит вам вместо этого использовать произвольные заменители скобок, например

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)  

Я до смешного опаздываю на эту вечеринку. Мне удалось разместить скобки в заменяющем элементе, например:

      print('{0} {1}'.format('{hello}', '{world}'))

который печатает

      {hello} {world}

Строго говоря, это не то, о чем спрашивает OP, поскольку он / она хочет скобки в строке формата, но это может кому-то помочь.

Я использовал двойной {{}}, чтобы предотвратить добавление значения fstring,

например, вот мой оператор Postgres UPDATE для обновления столбца целочисленного массива, который принимает выражение {} для захвата массива, то есть:

порты = '{100,200,300}'

с fstrings его,

      ports = [1,2,3]

query = f"""
   UPDATE table SET ports = '{{{ports}}}' WHERE id = 1
"""

фактическая инструкция запроса будет,

      UPDATE table SET ports = '{1,2,3}'

что является действительным заявлением postgres

Если вы хотите напечатать только одну сторону фигурной скобки:

      a=3
print(f'{"{"}{a}')
>>> {3

Вы можете использовать «стенку кавычек», чтобы отделить отформатированную строковую часть от обычной строковой части.

Из:

      print(f"{Hello} {42}")

к

      print("{Hello}"f" {42}")

Более ясным примером может быть

      string = 10
print(f"{string} {word}")

Выход:

      NameError: name 'word' is not defined

Теперь добавьте стену с цитатами следующим образом:

      string = 10
print(f"{string}"" {word}")

Выход:

      10 {word}

Ты можешь использовать String.Template():

from string import Template
s = Template('$txt, $num')
s.substitute(txt='{Hello}', num='42 ')

Я столкнулся с этой проблемой при попытке распечатать текст, который можно скопировать и вставить в латексный документ. Я расширяю этот ответ и использую именованные поля замены:

Допустим, вы хотите распечатать продукт из нескольких переменных с такими индексами, как , которые в латексе будут$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))

Или просто параметризовать сам кронштейн? Наверное, очень многословно.

      x = '{open_bracket}42{close_bracket}'.format(open_bracket='{', close_bracket='}') 
print(x)
# {42}

Если вам нужны фигурные скобки в шаблоне f-строки, который можно форматировать, вам необходимо вывести строку, содержащую две фигурные скобки в наборе фигурных скобок для f-строки:

      css_template = f"{{tag}} {'{{'} margin: 0; padding: 0;{'}}'}"
for_p = css_template.format(tag="p")
# 'p { margin: 0; padding: 0;}'

Если вы хотите напечатать только одну фигурную скобку (например,{) ты можешь использовать {{, и вы можете добавить фигурные скобки позже в строку, если хотите. Например:

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

Вы можете сделать это, используя метод необработанной строки, просто добавив перед строкой символ 'r' без кавычек.

# to print '{I am inside braces}'
print(r'{I am inside braces}')

Когда вы просто пытаетесь интерполировать строки кода, я бы предложил использовать 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))

Таким образом, вы не будете вынуждены дублировать фигурные скобки, как предлагает целый ряд других ответов.

Используйте escape-последовательности для выхода из фигурных скобок в f-строке. Пример:print(f'{a={1}}')

Если вам нужно заключить скобки вокруг значения ключа словарей параметров или списков метода форматирования, попробуйте следующее:

>>> "{o}Hello {a}{c}".format(**{"o":"{","c":"}","a":42})
'{Hello 42}'
Другие вопросы по тегам