web-dev-qa-db-fra.com

Convertir un dictionnaire de chaînes unicode en dictionnaire en python

J'ai unicode u"{'code1':1,'code2':1}" et je le veux au format dictionnaire.

Je le veux au format {'code1':1,'code2':1}.

J'ai essayé unicodedata.normalize('NFKD', my_data).encode('ascii','ignore') mais il retourne une chaîne, pas un dictionnaire.

Quelqu'un peut-il m'aider?

41
Sudhir Arya

Vous pouvez utiliser le package ast intégré: 

import ast

d = ast.literal_eval("{'code1':1,'code2':1}")

Aide sur la fonction literal_eval dans le module ast:

literal_eval (node_or_string)

Évaluez en toute sécurité un nœud d'expression ou une chaîne contenant une expression Python. La chaîne ou le noeud fourni ne peut contenir que les structures littérales Python suivantes: chaînes, nombres, n-uplets, listes, dicts, booléens et aucun.

74
aga

Vous pouvez utiliser literal_eval. Vous voudrez peut-être aussi vous assurer que vous créez un dict et pas autre chose. Au lieu de assert, utilisez votre propre gestion des erreurs. 

from ast import literal_eval
from collections import MutableMapping

my_dict = literal_eval(my_str_dict)
assert isinstance(my_dict, MutableMapping)
15
pyrospade

EDIT: il s'avère que mon hypothèse était incorrecte; comme les clés ne sont pas entourées de guillemets ("), la chaîne n'est pas JSON. Voir ici pour certaines solutions.

Je suppose que ce que vous avez peut-être pourrait être JSON , a.k.a. JavaScript Object Notation.

Vous pouvez utiliser le module json intégré de Python pour faire ceci: 

import json
result = json.loads(u"{'code1':1,'code2':1}")   # will NOT work; see above
9
Alastair Irvine

J'obtenais une erreur Unicode quand je lisais un JSON à partir d'un fichier. Alors celui-ci a fonctionné pour moi. 

import ast
job1 = {}
with open('hostdata2.json') as f:
  job1= json.loads(f.read())

f.close()

#print type before converting this from unicode to dic would be <type 'unicode'>

print type(job1)
job1 =  ast.literal_eval(job1)
print "printing type after ast"
print type(job1)
# this should result <type 'dict'>

for each in job1:
 print each
print "printing keys"
print job1.keys()
print "printing values"
print job1.values()
0
Meena Rajani