J'ai un script qui change un dict en chaîne et l'enregistre dans un fichier. J'aimerais ensuite charger ce fichier et l'utiliser comme dict, mais c'est une chaîne. Y a-t-il quelque chose comme int("7")
qui peut changer une chaîne formatée en dict ({a: 1, b: 2}
) En dict? J'ai essayé dict()
, mais cela ne semble pas être ce qu'il fait. J'ai entendu parler d'un processus impliquant JSON et eval()
, mais je ne vois pas vraiment ce que cela fait. Le programme charge les mêmes données qu'il enregistre, et si quelqu'un les modifie et que cela ne fonctionne pas, ce n'est pas un problème pour moi (je n'ai besoin d'aucune méthode avancée pour confirmer les données dict ou quoi que ce soit).
Essayez ceci, c'est le moyen le plus sûr:
import ast
ast.literal_eval("{'x':1, 'y':2}")
=> {'y': 2, 'x': 1}
Toutes les solutions basées sur eval()
sont dangereuses, du code malveillant pourrait être injecté à l'intérieur de la chaîne et être exécuté.
Selon le documentation l'expression est évaluée en toute sécurité. En outre, selon le code source , literal_eval
Analyse la chaîne en un python AST (arbre source) , et ne renvoie que s'il s'agit d'un littéral. Le code n'est jamais exécuté, mais seulement analysé, il n'y a donc aucune raison pour qu'il y ait un risque pour la sécurité.
Ce format n'est pas JSON, mais YAML, que vous pouvez analyser avec PyYAML :
>>> import yaml
>>> s = '{a: 1, b: 2}'
>>> d = yaml.load(s)
>>> d
{'a': 1, 'b': 2}
>>> type(d)
<type 'dict'>
Vous pouvez utiliser eval
si vous faites confiance à la chaîne d'entrée.
>>> a=eval('{"a":1,"b":2}')
>>> a
{'a': 1, 'b': 2}
Ce que vous parlez de faire est sérialisation d'objet , et il y a de meilleures façons de le faire que de rouler votre propre méthode de sérialisation (bien que vous sembliez avoir trouvé YAML). Les deux sont encore moins sécurisés que l'approche ast.literal_eval()
(pickle
en particulier), mais ils doivent certainement être notés ici.
Voici un exemple de ce que vous voulez utiliser JSON , un format multi-langue populaire:
import json
myDict = {'a':1, 'b':2}
# write to the file 'data'
with open('data','w') as f:
json.dump(myDict, f)
# now we can load it back
with open('data','r') as f:
myDictLoaded = json.load(f)
print myDictLoaded
{u'a': 1, u'b': 2}
Voici un deuxième exemple faisant la même chose en utilisant pickle . pickle
est plus puissant dans la mesure où il peut sérialiser tous les objets * python, même ceux que vous écrivez.
import cPickle as pickle
myDict = {'a':1, 'b':2}
# write to the file 'data'
with open('data','w') as f:
pickle.dump(myDict, f)
# now we can load it back
with open('data','r') as f:
myDictLoaded = pickle.load(f)
print myDictLoaded
{'a': 1, 'b': 2}