Search code examples
pythonstringdictionarytype-conversion

Convert a String representation of a Dictionary to a dictionary


How can I convert the str representation of a dictionary, such as the following string, into a dict?

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

I prefer not to use eval. What else can I use?


Solution

  • 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