2013-12-12 126 views
3

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

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现在丢失。)

回答

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']) 
+0

是这么简单吗? (看来我需要一个'write()'作为我的对象,你对我的示例widget有什么用处?) – Basj

+0

不,你不需要写它。 'json.dump'会自动将你需要的内容导出到指定的文件中。 – aIKid

+0

我试图将你的代码粘贴到我的末尾,我得到: 'AttributeError:'str'object has no attribute'write'' – Basj

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

更新:simplejson是从标准库(在2.6添加到标准库)json。欲了解更多详情,请参阅:What are the differences between json and simplejson Python modules?

+0

哼,我想我无法决定'json'还是'simplejson'会更适合。你将如何在我的例子中保存对象(我需要在我的类中使用'write()')方法吗? – Basj

+0

woud你有我的简单对象示例(包含一个小部件,一个x,一个y,一个字符串的对象)的提示吗? – Basj

+1

我编辑我的例子为你的事业。如果您需要更多详细信息,请发表评论。 – Jon

3

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

有关详细信息,请参阅: http://docs.python.org/2/library/pickle.html

还有一个第三方库使类作为JSON存储。 http://jsonpickle.github.io/

我还没有使用它自己,但这样不能确保输出是怎样人类可读的,但是如果你想要做的是它存储为文件和应用程序重启我没有看到任何后重新装入JSON/XML优于使用Pickle的优势。

编辑:正如其他人指出,你可以使用cPickle超过泡菜更好的性能。算法是一样的,所以你用完全相同的方式。

+0

作为泡菜的+1可能明显更快。 – Jon

+0

就个人而言,我总是使用'cPickle'而不是'pickle'。 – Jon