我一直在努力构建一个复杂的数据结构,它将返回一个字典。目前该类返回表单
的字符串对象{
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
如果可能的话,我正在寻找一些其他更简洁的方法。
很高兴知道任何这样的方式。
答案 0 :(得分:8)
请勿使用eval
。如果您确定该字符串将始终包含有效的Python dict
,请使用ast.literal_eval
。这与eval
非常相似,但它仅评估表达式是否为有效dict
,list
等,如果不是,则抛出异常。这比尝试在运行时评估可能包含任意代码的字符串更安全。
来自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)