x = " \{ Hello \} {0} "
print x.format(42)
me donne: Key Error: Hello\\
Je veux imprimer le résultat: {Hello} 42
Vous devez doubler les {{
et }}
:
>>> x = " {{ Hello }} {0} "
>>> print x.format(42)
' { Hello } 42 '
Voici la partie pertinente de la documentation Python pour la syntaxe de chaîne de formatage :
Les chaînes de format contiennent des "champs de remplacement" entourés d'accolades
{}
. Tout ce qui n'est pas entre accolades est considéré comme du texte littéral, qui est copié tel quel dans la sortie. Si vous devez inclure une accolade dans le texte littéral, vous pouvez l'échapper en doublant:{{
et}}
.
Vous y échappez en doublant les bretelles.
Par exemple:
x = "{{ Hello }} {0}"
print x.format(42)
L'OP a écrit ce commentaire:
J'essayais de formater un petit JSON à certaines fins, comme ceci:
'{"all": false, "selected": "{}"}'.format(data)
pour obtenir quelque chose comme{"all": false, "selected": "1,2"}
Il est assez courant que le problème des "accouplements d'échappement" se pose lorsqu'il est question de JSON.
Je suggère de faire ceci:
import json
data = "1,2"
mydict = {"all": "false", "selected": data}
json.dumps(mydict)
C'est plus propre que l'alternative, qui est:
'{{"all": false, "selected": "{}"}}'.format(data)
L'utilisation de la bibliothèque json
est définitivement préférable lorsque la chaîne JSON devient plus compliquée que l'exemple.
Python 3.6+ (2017)
Dans les versions récentes de Python, on utiliserait chaînes f (voir aussi PEP498 ).
Avec les f-strings, on devrait utiliser double {{
ou }}
n = 42
print(f" {{Hello}} {n} ")
produit le désiré
{Hello} 42
Si vous devez résoudre une expression entre crochets au lieu d'utiliser du texte littéral, vous aurez besoin de trois jeux de crochets:
hello = "HELLO"
print(f"{{{hello.lower()}}}")
produit
{hello}
Essayez de faire ceci:
x = " {{ Hello }} {0} "
print x.format(42)
Essaye ça:
x = "{{ Hello }} {0}"
Bien que ce ne soit pas mieux, juste pour la référence, vous pouvez aussi le faire:
>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42
Cela peut être utile par exemple lorsque quelqu'un veut imprimer {argument}
. C'est peut-être plus lisible que '{{{}}}'.format('argument')
Notez que vous omettez les positions d’argument (par exemple, {}
au lieu de {0}
) après Python 2.7.
Si vous faites cela souvent, il peut être utile de définir une fonction utilitaire qui vous permettra d'utiliser des substituts d'accolades arbitraires, comme
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}'
Notez que cela fonctionnera avec des crochets étant une chaîne de longueur 2 ou un itérable de deux chaînes (pour les délimiteurs multi-caractères).
La raison en est que {}
correspond à la syntaxe de .format()
. Dans votre cas, .format()
ne reconnaît donc pas {Hello}
et a donc généré une erreur.
vous pouvez le remplacer en utilisant des doubles accolades {{}},
x = " {{ Hello }} {0} "
ou
essayez %s
pour la mise en forme du texte,
x = " { Hello } %s"
print x%(42)
Si vous devez conserver deux accolades dans la chaîne, vous avez besoin de 5 accolades de chaque côté de la variable.
>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'
Vous pouvez utiliser String.Template()
:
from string import Template
s = Template('$txt, $num')
s.substitute(txt='{Hello}', num='42 ')