x = " \{ Hello \} {0} "
print(x.format(42))
私に与える: Key Error: Hello\\
出力を印刷したい: {Hello} 42
x = " \{ Hello \} {0} "
print(x.format(42))
私に与える: Key Error: Hello\\
出力を印刷したい: {Hello} 42
回答:
{{
and を2倍にする必要があります}}
。
>>> 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をご覧ください。
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の文字列または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))
あなたがしたい場合にのみ(例えば1つの中括弧を印刷{
)を使用でき{{
、あなたがしたい場合は、後で文字列に多くの括弧を追加することができます。例えば:
>>> 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}')
\{I am inside braces\}
ます。