将字典的string表示forms转换为字典?

如何将dictstr表示forms(如下面的string)转换为dict

 s = "{'muffin' : 'lolz', 'foo' : 'kitty'}" 

我不喜欢使用eval 。 我还能使用什么?

主要原因是他写的同事class之一,将所有的input转换成string。 我没有心情去修改他的课,来处理这个问题。

从Python 2.6开始,您可以使用内置的ast.literal_eval

 >>> import ast >>> ast.literal_eval("{'muffin' : 'lolz', 'foo' : 'kitty'}") {'muffin': 'lolz', 'foo': 'kitty'} 

这比使用eval更安全。 正如其自己的文档所说:

 >>> help(ast.literal_eval)
帮助模块ast中的函数literal_eval:

 literal_eval(node_or_string)
    安全地评估expression式节点或包含Python的string
    expression。 提供的string或节点可能只包含以下内容
     Python文字结构:string,数字,元组,列表,字典,布尔值,
    和None。

例如:

 >>> eval("shutil.rmtree('mongo')") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<string>", line 1, in <module> File "/opt/Python-2.6.1/lib/python2.6/shutil.py", line 208, in rmtree onerror(os.listdir, path, sys.exc_info()) File "/opt/Python-2.6.1/lib/python2.6/shutil.py", line 206, in rmtree names = os.listdir(path) OSError: [Errno 2] No such file or directory: 'mongo' >>> ast.literal_eval("shutil.rmtree('mongo')") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 68, in literal_eval return _convert(node_or_string) File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 67, in _convert raise ValueError('malformed string') ValueError: malformed string 

http://docs.python.org/2/library/json.html

JSON可以解决这个问题,虽然它的解码器需要双引号和键值。 如果你不介意更换黑客…

 import json s = "{'muffin' : 'lolz', 'foo' : 'kitty'}" json_acceptable_string = s.replace("'", "\"") d = json.loads(json_acceptable_string) # d = {u'muffin': u'lolz', u'foo': u'kitty'} 

请注意,如果您将单引号作为键或值的一部分,则由于不正确的字符replace而失败。 只有在对eval解决scheme有强烈反感的情况下才推荐此解决scheme。

更多关于json单引号:json单引号在JSON响应中

使用json.loads

 >>> import json >>> h = '{"foo":"bar", "foo2":"bar2"}' >>> type(h) <type 'str'> >>> d = json.loads(h) >>> d {u'foo': u'bar', u'foo2': u'bar2'} >>> type(d) <type 'dict'> 

如果string总是可信的,那么可以使用eval (或者按照build议使用literal_eval ;无论string是什么都是安全的)。否则,你需要一个parsing器。 JSONparsing器(如simplejson)将工作,如果他只存储符合JSONscheme的内容。

使用Json。 ast库消耗大量内存,而且速度较慢。 我有一个需要读取156Mb的文本文件的过程。 与5分钟延迟5分钟字典Json转换和1分钟使用60%的内存!

以OP为例:

 s = "{'muffin' : 'lolz', 'foo' : 'kitty'}" 

我们可以使用Yaml来处理string中的这种非标准的json:

 >>> import yaml >>> s = "{'muffin' : 'lolz', 'foo' : 'kitty'}" >>> s "{'muffin' : 'lolz', 'foo' : 'kitty'}" >>> yaml.load(s) {'muffin': 'lolz', 'foo': 'kitty'} 

如果你不能使用Python 2.6,你可以使用一个简单的safeeval implmenentation,如http://code.activestate.com/recipes/364469/

它搭载Python编译器,所以你不必自己做所有的工作。

你可以试试这个

  >>> import ast >>> data = "{'user': 'bob', 'age': 10, 'grades': ['A', 'F', 'C']}" >>> ast.literal_eval(data) O/P: {'age': 10, 'grades': ['A', 'F', 'C'], 'user': 'bob'} >>> user = ast.literal_eval(data) >>> user['age'] O/P: 10 >>> user['grades'] O/P: ['A', 'F', 'C'] >>> user['user'] O/P: 'bob' 
 string = "{'server1':'value','server2':'value'}" #Now removing { and } s = string.replace("{" ,""); finalstring = s.replace("}" , ""); #Splitting the string based on , we get key value pairs list = finalstring.split(",") dict ={} for i in list: #Get Key Value pairs separately to store in dictionary keyvalue = i.split(":") #Replacing the single quotes in the leading. m= keyvalue[0].strip('\'') m = m.replace("\"", "") dict[m] = keyvalue[1].strip('"\'') print dict 

没有任何库被使用:

 dict_format_string = "{'1':'one', '2' : 'two'}" d = {} elems = filter(str.isalnum,dict_format_string.split("'")) values = elems[1::2] keys = elems[0::2] d.update(zip(keys,values)) 

注意:由于硬编码分割(“'”)仅适用于数据为“单引号”的string。