web-dev-qa-db-fra.com

Conversion de chaîne en dict?

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).

24
tkbx

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é.

53
Óscar López

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'>
13
phihag

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}
7
Matthew Adams

Sérialisation

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.

JSON

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

Sortie:

{u'a': 1, u'b': 2}

cornichon

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

Sortie:

{'a': 1, 'b': 2}
4
Matthew Adams