Convert a String representation of a Dictionary to a dictionary? Convert a String representation of a Dictionary to a dictionary? python python

Convert a String representation of a Dictionary to a dictionary?


You can use the built-in ast.literal_eval:

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

This is safer than using eval. As its own docs say:

>>> help(ast.literal_eval)Help on function literal_eval in module ast:literal_eval(node_or_string)    Safely evaluate an expression node or a string containing a Python    expression.  The string or node provided may only consist of the following    Python literal structures: strings, numbers, tuples, lists, dicts, booleans,    and None.

For example:

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


https://docs.python.org/3.8/library/json.html

JSON can solve this problem though its decoder wants double quotes around keys and values. If you don't mind a replace hack...

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

NOTE that if you have single quotes as a part of your keys or values this will fail due to improper character replacement. This solution is only recommended if you have a strong aversion to the eval solution.

More about json single quote: jQuery.parseJSON throws “Invalid JSON” error due to escaped single quote in JSON


using json.loads:

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