在Python中将对象保存到JSON或XML文件中

时间:2013-12-12 09:48:47

标签: python xml json serialization tkinter

我创建了我希望保存在JSON或XML文件中的对象(使用tkinter小部件),以便我可以在启动后恢复它们。

from Tkinter import *

class Texte:
    def __init__(self, ax, ay, txt):
        self.entry = Entry(root,bd=0,font=("Purisa",int(15)))
        self.entry.insert(0, txt)
        self.x = ax
        self.y = ay 
        self.entry.place(x=self.x,y=self.y)

root = Tk()

a = Texte(10, 20, 'blah')
b = Texte(20, 70, 'blah2')

# here the user will modify the entries' x, y, txt, etc.

L = [a,b]

# here save the list L (containing the Texte objects) into a JSON file or XML so that I can recover them after restart 

root.mainloop()

如何使用JSON或XML保存和恢复这些对象?

(我现在有点迷失http://docs.python.org/2/library/json.html。)

3 个答案:

答案 0 :(得分:5)

在文档中提到,使用json.dump

使用示例:

import json

data = {'a':1, 'b':2}
with open('my_json.txt', 'w') as fp:
    json.dump(data, fp)

在您的情况下,您无法将对象本身转换为json格式。仅保存信息:

data = {'a':(10, 20, 'blah'), 'b':(20, 70, 'blah2')
with open('my_json.txt', 'w') as fp:
     json.dump(data, fp)

当你加载它时:

with open('my_json.txt') as fp:
    data = json.loads(fp)
    a = Texte(*data['a'])
    b = Texte(*data['b'])

答案 1 :(得分:3)

如果您从未在Application之外修改这些对象,为什么需要JSON或XML? 如果您不在应用程序之外更改数据,可以使用pickle模块将对象序列化和反序列化为二进制数据或ASCII字符串并保存。

详情请见: http://docs.python.org/2/library/pickle.html

还有一个第三方库,可以将类存储为JSON。 http://jsonpickle.github.io/

我还没有自己使用它,但是不确定输出的可读性如何,但是如果你想要做的就是将它存储为文件并在应用程序重启后重新加载它我不会看到JSON / XML优于使用Pickle的任何优势。

编辑:正如其他人指出的那样,你可以使用cPickle而不是泡菜来获得更好的性能。算法是相同的,所以你以完全相同的方式使用它们。

答案 2 :(得分:1)

请参阅更新:jsonsimplejson

json.dump(用于文件导出)和json.dumps(用于字符串导出)如果您有一个简单的对象,则非常有用。 但是,如果您需要保存更复杂的数据结构,如字典 填写了标准库斗争中的词典{'a':{...}, 'b':2} json

对于这种情况,像simplejson这样的工具可能很有用。 http://simplejson.readthedocs.org/en/latest/

>>> import simplejson as json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>> print(json.dumps("\"foo\bar"))
"\"foo\bar"
>>> print(json.dumps(u'\u1234'))
"\u1234"

由于您需要将复杂列表L保存到json - 我会使用simplejson。类似的东西:

import simplejson as json
with open('Texte.json', 'w') as texte_file:
    json.dump(L, texte_file)`
来自标准库的

更新: simplejsonjson(在2.6中添加到标准库中)。有关详细信息,请参阅:What are the differences between json and simplejson Python modules?