【问题标题】:Save objects into JSON or XML file in Python在 Python 中将对象保存到 JSON 或 XML 文件中
【发布时间】:2013-12-30 15:46:43
【问题描述】:

我创建了希望保存在 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 有点迷茫。)

【问题讨论】:

    标签: python xml json serialization tkinter


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 就我个人而言,我总是使用cPickle 而不是pickle
    【解决方案2】:

    文档中有提到,请使用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'])
    

    【讨论】:

    • 就这么简单吗? (看来我的对象需要一个write(),你知道在我的Entry 小部件示例中它可能是什么吗?)
    • 不,你不需要写。 json.dump 会自动将你需要的导出到指定文件中。
    • 我试图将您的代码粘贴到我的末尾,我得到:AttributeError: 'str' object has no attribute 'write'
    • 哦,哎呀,我应该传递文件对象。对不起!已更新。
    • 它现在运行,但生成的 .txt 文件仅包含 {"a": 1, "b": 2} 作为文本,而不包含对象 a 和 b 的内容
    【解决方案3】:

    请查看更新: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 是标准库中的 json(在 2.6 中添加到标准库)。更多详情请见:What are the differences between json and simplejson Python modules?

    【讨论】:

    • 嗯,我想我无法决定是json 还是simplejson 更适合。您将如何在我的类中保存我的示例中的对象(我是否需要 write())方法?
    • 您对我的简单对象示例(包含小部件、x、y、字符串的对象)有什么提示吗?
    • 我为您的原因编辑了我的示例。如果您需要更多详细信息,请发表评论。
    • 您从哪里发现标准 json 库在处理嵌套字典时会遇到困难?
    • @aIKid:感谢您的建议 (+1)。 simplejsonjson - 请参阅 stackoverflow.com/questions/712791/…
    猜你喜欢
    • 2016-02-21
    • 2016-08-15
    • 1970-01-01
    • 2021-04-08
    • 2020-02-24
    • 2018-06-17
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多