Question Comment puis-je imprimer des caractères littéraux entre accolades dans une chaîne python et utiliser également .format?


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

Donne moi : Key Error: Hello\\

Je veux imprimer la sortie: {Hello} 42


930
2018-03-29 00:04


origine


Réponses:


Vous devez doubler le {{ et }}:

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

Voici la partie pertinente de la Documentation Python pour la syntaxe de la chaîne de format:

Les chaînes de format contiennent des "champs de remplacement" entourés d'accolades {}. Tout ce qui n'est pas contenu dans les accolades est considéré comme du texte littéral, qui est copié sans modification dans la sortie. Si vous devez inclure un caractère d'accolade dans le texte littéral, il peut être échappé en doublant: {{ et }}.


1267
2018-03-29 00:08



Vous l'échappez en doublant les accolades.

Par exemple:

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

52
2018-03-29 00:08



Essayez de faire ceci:

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

24
2018-03-29 00:08



Essaye ça:

x = "{{ Hello }} {0}"


20
2018-03-29 00:08



Le PO a écrit ce commentaire:

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"}

Il est assez courant que le problème des "accolades d'échappement" apparaisse lorsqu'il s'agit 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)

En utilisant le json bibliothèque est définitivement préférable lorsque la chaîne JSON devient plus compliquée que l'exemple.


19
2018-06-06 18:59



Bien que pas mieux, juste pour la référence, vous pouvez également faire ceci:

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

Cela peut être utile par exemple quand quelqu'un veut imprimer {argument}. C'est peut-être plus lisible que '{{{}}}'.format('argument')

Notez que vous omettez les positions d'argument (par ex. {} au lieu de {0}) après Python 2.7


9
2017-11-05 11:22



Python 3.6 (2017)

Dans la version actuelle de Python on utiliserait f-cordes (voir également PEP498).

Aussi avec f-cordes on devrait utiliser double {{ ou }}

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

produit le désiré

 {Hello} 42

7
2017-12-21 11:12



Si vous allez le faire beaucoup, il pourrait être bon de définir une fonction utilitaire qui vous permettra d'utiliser des substituts arbitraires, à la place, 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 soit avec des crochets étant une chaîne de longueur 2 ou une itérable de deux chaînes (pour les délimiteurs multi-caractères).


4
2017-11-29 23:43



La raison est, {} est la syntaxe de .format() donc dans votre cas .format() ne reconnaît pas {Hello} donc ça a jeté une erreur.

vous pouvez le remplacer en utilisant des doubles accolades {{}},

x = " {{ Hello }} {0} "

ou

essayer %s pour le formatage du texte,

x = " { Hello } %s"
print x%(42)  

1
2018-06-27 12:40



Si vous devez placer des accolades autour de la valeur d'une clé des dictionnaires de paramètres ou des listes de la méthode de format, essayez ce qui suit:

>>> "{o}Hello {a}{c}".format(**{"o":"{","c":"}","a":42})
'{Hello 42}'

-5
2018-02-15 14:39