Python将字符串对象转换为字典

时间:2010-07-14 18:43:50

标签: python string dictionary

我一直在努力构建一个复杂的数据结构,它将返回一个字典。目前该类返回表单

的字符串对象
{
   cset : x,    
   b1   : y,
   b2   : z,    
   dep  : {    
              cset : x1,
              b1   : y1,    
              b2   : z1,    
              dep  : {    
                         cset : x2,     
                         b1   : y2,    
                         b2   : z2,    
                         dep  : <same as above.it  recurses few more levels>                         
                         ...  
                     }
        }
    }

我想将整个字符串对象转换为字典。 我在其中一篇文章中读到使用pickle模块,但我不想将其序列化为某个文件并使用它。

参考:http://bytes.com/topic/python/answers/36059-convert-dictionary-string-vice-versa

如果可能的话,我正在寻找一些其他更简洁的方法。

很高兴知道任何这样的方式。

4 个答案:

答案 0 :(得分:8)

请勿使用eval。如果您确定该字符串将始终包含有效的Python dict,请使用ast.literal_eval。这与eval非常相似,但它仅评估表达式是否为有效dictlist等,如果不是,则抛出异常。这比尝试在运行时评估可能包含任意代码的字符串更安全。

来自docs

  

安全地评估表达式节点或   包含Python的字符串   表达。字符串或节点   提供的可能只包括   遵循Python文字结构:   字符串,数字,元组,列表,   dicts,booleans和None。

     

这可用于安全评估   包含Python表达式的字符串   来自不受信任的来源,没有   需要自己解析价值观。

代码示例:

>>> import ast
>>> ast.literal_eval("1+1")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/ast.py", line 68, in literal_eval
    return _convert(node_or_string)
  File "/usr/lib/python2.6/ast.py", line 67, in _convert
    raise ValueError('malformed string')
ValueError: malformed string
>>> ast.literal_eval("\"1+1\"")
'1+1'
>>> ast.literal_eval("{'a': 2, 'b': 3, 3:'xyz'}")
{'a': 2, 3: 'xyz', 'b': 3}

答案 1 :(得分:1)

如果你足够小心保持代码有效python,你可以使用eval

eval(yourlongstring)

答案 2 :(得分:0)

这是实际的数据格式吗?你有什么灵活性吗?

它几乎是JSON,这是一种标准数据格式,Python具有用于读写的本机库(序列化和反序列化)。但是,要使其成为有效的JSON,键和值都需要用引号括起来:

"cset" : "x",
"b1"   : "y"

等等。

答案 3 :(得分:-1)

你可能想要使用Pickle:

http://docs.python.org/library/pickle.html#pickle.dumps

它也可以将值作为字符串返回,而不是写入文件。