[英]Save objects into JSON or XML file in Python
我創建了我希望保存在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 。)
它在文檔中提到,使用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'])
如果您從未在Application之外修改這些對象,為什么需要JSON或XML? 如果不在應用程序之外更改數據,可以使用pickle模塊將對象序列化和反序列化為二進制數據或ASCII字符串並保存。
有關詳細信息,請參閱: http : //docs.python.org/2/library/pickle.html
還有一個第三方庫,可以將類存儲為JSON。 http://jsonpickle.github.io/
我自己還沒有使用它,但是不確定輸出的可讀性如何,但是如果你想要做的就是將它存儲為文件並在應用程序重啟后重新加載它我看不到任何JSON / XML的優點使用泡菜。
編輯:正如其他人所指出的,你可以使用cPickle而不是泡菜來獲得更好的性能。 算法是相同的,所以你以完全相同的方式使用它們。
請參閱更新: json
是simplejson
。
如果你有一個簡單的對象, 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
是標准庫中的json
(在2.6中添加到標准庫中)。 有關更多詳細信息,請參閱: json和simplejson Python模塊之間有什么區別? 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.