web-dev-qa-db-fra.com

Comment créer un dictionnaire Python avec des guillemets doubles comme format de devis par défaut?

J'essaie de créer un dictionnaire python qui doit être utilisé comme un script Java var dans un fichier html à des fins de visualisation). Au besoin, je suis besoin de créer le dictionnaire avec tous les noms entre guillemets doubles au lieu des guillemets simples par défaut qui Python utilise. Existe-t-il un moyen simple et élégant pour y parvenir.

    couples = [
               ['jack', 'ilena'], 
               ['arun', 'maya'], 
               ['hari', 'aradhana'], 
               ['bill', 'samantha']]
    pairs = dict(couples)
    print pairs

Sortie générée:

{'arun': 'maya', 'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana'}

Sortie attendue:

{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}

Je sais, json.dumps(pairs) fait le travail, mais le dictionnaire dans son ensemble est converti en une chaîne qui n'est pas ce que j'attends.

P.S.: Existe-t-il une autre façon de le faire en utilisant json, car j'ai affaire à des dictionnaires imbriqués.

43
Shankar

Vous pouvez construire votre propre version d'un dict avec une impression spéciale en utilisant json.dumps():

>>> import json
>>> class mydict(dict):
        def __str__(self):
            return json.dumps(self)

>>> couples = [['jack', 'ilena'], 
               ['arun', 'maya'], 
               ['hari', 'aradhana'], 
               ['bill', 'samantha']]    

>>> pairs =  mydict(couples) 
>>> print pairs
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}

Vous pouvez également parcourir:

>>> for el in pairs:
       print el

arun
bill
jack
hari
34
elyase

json.dumps() est ce que vous voulez ici, si vous utilisez print json.dumps(pairs) vous obtiendrez la sortie attendue:

>>> pairs = {'arun': 'maya', 'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana'}
>>> print pairs
{'arun': 'maya', 'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana'}
>>> import json
>>> print json.dumps(pairs)
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
51
Andrew Clark

Voici une version de base print:

>>> print '{%s}' % ', '.join(['"%s": "%s"' % (k, v) for k, v in pairs.items()])
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
4
Brent Washburne

La prémisse de la question est fausse:

I know, json.dumps(pairs) does the job, but the dictionary 
as a whole is converted into a string which isn't what I am expecting.

Vous devez vous attendre à une conversion en chaîne. Tout ce que "imprimer" fait, c'est convertir un objet en une chaîne et l'envoyer à la sortie standard.

Quand Python voit:

print somedict

Ce qu'il fait vraiment, c'est:

sys.stdout.write(somedict.__str__())
sys.stdout.write('\n')

Comme vous pouvez le voir, le dict est toujours converti en chaîne (après tout, une chaîne est le seul type de données que vous pouvez envoyer à un fichier tel que stdout).

Le contrôle de la conversion en chaîne peut se faire soit en définissant __str__ pour un objet (comme l'ont fait les autres répondants), soit en appelant une jolie fonction d'impression telle que json.dumps(). Bien que les deux façons aient le même effet de créer une chaîne à imprimer, cette dernière technique présente de nombreux avantages (vous n'avez pas à créer un nouvel objet, elle s'applique récursivement aux données imbriquées, elle est standard, elle est écrite en C pour vitesse, et il est déjà bien testé).

Le postscript manque toujours le point:

P.S.: Is there an alternate way to do this with using json, since I am
dealing with nested dictionaries.

Pourquoi travailler si dur pour éviter le module json? À peu près n'importe quelle solution au problème de l'impression de dictionnaires imbriqués avec des guillemets doubles réinventera ce que json.dumps () fait déjà.

4
Raymond Hettinger
# do not use this until you understand it
import json

class doubleQuoteDict(dict):
    def __str__(self):
        return json.dumps(self)

    def __repr__(self):
        return json.dumps(self)

couples = [
           ['jack', 'ilena'], 
           ['arun', 'maya'], 
           ['hari', 'aradhana'], 
           ['bill', 'samantha']]
pairs = doubleQuoteDict(couples)
print pairs

Rendements:

{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
4
Russell Borogove

Le problème qui m'a eu plusieurs fois concerne le chargement d'un fichier json.

import json
with open('json_test.json', 'r') as f:
    data = json.load(f)
    print(type(data), data)
    json_string = json.dumps(data)
    print(json_string)

Je passe accidentellement des données à une fonction qui veut une chaîne json et j'obtiens l'erreur que le guillemet simple n'est pas un json valide. Je revérifie le fichier json d'entrée et vois les guillemets doubles, puis je me gratte la tête pendant une minute.

Le problème est que les données sont un dict et non une chaîne, mais quand Python les convertit pour vous, ce n'est PAS un json valide.

<class 'dict'> {'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana', 'arun': 'maya'}
{"bill": "samantha", "jack": "ilena", "hari": "aradhana", "arun": "maya"}

Si le json est valide et que le dict n'a pas besoin d'être traité avant la conversion en chaîne, il suffit de charger car la chaîne fait l'affaire.

with open('json_test.json', 'r') as f:
    json_string = f.read()
    print(json_string)
1
shao.lo