Convert a python dict to a string and back

PythonJsonDictionarySerialization

Python Problem Overview


I am writing a program that stores data in a dictionary object, but this data needs to be saved at some point during the program execution and loaded back into the dictionary object when the program is run again. How would I convert a dictionary object into a string that can be written to a file and loaded back into a dictionary object? This will hopefully support dictionaries containing dictionaries.

Python Solutions


Solution 1 - Python

The json module is a good solution here. It has the advantages over pickle that it only produces plain text output, and is cross-platform and cross-version.

import json
json.dumps(dict)

Solution 2 - Python

If your dictionary isn't too big maybe str + eval can do the work:

dict1 = {'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }}
str1 = str(dict1)

dict2 = eval(str1)

print(dict1 == dict2)

You can use ast.literal_eval instead of eval for additional security if the source is untrusted.

Solution 3 - Python

I use json:

import json

# convert to string
input = json.dumps({'id': id })

# load to dict
my_dict = json.loads(input) 

Solution 4 - Python

Why not to use Python 3's inbuilt ast library's function literal_eval. It is better to use literal_eval instead of eval

import ast
str_of_dict = "{'key1': 'key1value', 'key2': 'key2value'}"
ast.literal_eval(str_of_dict)

will give output as actual Dictionary

{'key1': 'key1value', 'key2': 'key2value'}

And If you are asking to convert a Dictionary to a String then, How about using str() method of Python.

Suppose the dictionary is :

my_dict = {'key1': 'key1value', 'key2': 'key2value'}

And this will be done like this :

str(my_dict)

Will Print :

"{'key1': 'key1value', 'key2': 'key2value'}"

This is the easy as you like.

Solution 5 - Python

Use the pickle module to save it to disk and load later on.

Solution 6 - Python

Convert dictionary into JSON (string)

import json 
  
mydict = { "name" : "Don", 
          "surname" : "Mandol", 
          "age" : 43} 

result = json.dumps(mydict)

print(result[0:20])

will get you:

> {"name": "Don", "sur

Convert string into dictionary

back_to_mydict = json.loads(result) 

Solution 7 - Python

In Chinese language you should do the following adjustments:

import codecs
fout = codecs.open("xxx.json", "w", "utf-8")
dict_to_json = json.dumps({'text':"中文"},ensure_ascii=False,indent=2)
fout.write(dict_to_json + '\n')

Solution 8 - Python

I think you should consider using the shelve module which provides persistent file-backed dictionary-like objects. It's easy to use in place of a "real" dictionary because it almost transparently provides your program with something that can be used just like a dictionary, without the need to explicitly convert it to a string and then write to a file (or vice-versa).

The main difference is needing to initially open() it before first use and then close() it when you're done (and possibly sync()ing it, depending on the writeback option being used). Any "shelf" file objects create can contain regular dictionaries as values, allowing them to be logically nested.

Here's a trivial example:

import shelve

shelf = shelve.open('mydata')  # open for reading and writing, creating if nec
shelf.update({'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }})
shelf.close()

shelf = shelve.open('mydata')
print shelf
shelf.close()

Output:

{'three': {'three.1': 3.1, 'three.2': 3.2}, 'two': 2, 'one': 1}

Solution 9 - Python

You may find the json.dumps() method needs help handling some object types.

Credit goes to the top answer of this post for the following:

import json
json.dumps(my_dictionary, indent=4, sort_keys=True, default=str)

Solution 10 - Python

If you care about the speed use ujson (UltraJSON), which has the same API as json:

import ujson
ujson.dumps([{"key": "value"}, 81, True])
# '[{"key":"value"},81,true]'
ujson.loads("""[{"key": "value"}, 81, true]""")
# [{u'key': u'value'}, 81, True]

Solution 11 - Python

I use yaml for that if needs to be readable (neither JSON nor XML are that IMHO), or if reading is not necessary I use pickle.

Write

from pickle import dumps, loads
x = dict(a=1, b=2)
y = dict(c = x, z=3)
res = dumps(y)
open('/var/tmp/dump.txt', 'w').write(res)

Read back

from pickle import dumps, loads
rev = loads(open('/var/tmp/dump.txt').read())
print rev

Solution 12 - Python

I figured out the problem was not with my dict object it was the keys and values that were of RubyString type after loading it with RubyMarshl 'loads' method

So i did this:

dic_items = dict.items()
new_dict = {str(key): str(value) for key, value in dic_items}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAJ00200View Question on Stackoverflow
Solution 1 - PythonTyler EavesView Answer on Stackoverflow
Solution 2 - PythonPabloGView Answer on Stackoverflow
Solution 3 - PythonEyal ChView Answer on Stackoverflow
Solution 4 - PythonFightWithCodeView Answer on Stackoverflow
Solution 5 - PythonismailView Answer on Stackoverflow
Solution 6 - PythonHrvojeView Answer on Stackoverflow
Solution 7 - PythonbetaView Answer on Stackoverflow
Solution 8 - PythonmartineauView Answer on Stackoverflow
Solution 9 - PythonmathandyView Answer on Stackoverflow
Solution 10 - PythonTomasz BartkowiakView Answer on Stackoverflow
Solution 11 - PythonGerardView Answer on Stackoverflow
Solution 12 - PythonAbdul Muiz KhanView Answer on Stackoverflow