Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当字典更改时保存它_Python - Fatal编程技术网

Python 当字典更改时保存它

Python 当字典更改时保存它,python,Python,我保存了一本通过用户界面修改的词典。与用户控制的“保存”功能不同,我希望在字典发生更改时将其写入JSON文件。我知道保存的机制,但不知道如何在字典中更改时触发保存。这是否可能,如果可能,如何实现?您不能使用默认dict类型,但可以使用自定义字典子类或and intercept方法的子类来更改字典,以便触发保存 后者最简单;它将所有修改方法映射到_usetItem_;。您需要在的“抽象方法”列中提供所有方法 以下是我对此类课程的简要描述: import json from collections

我保存了一本通过用户界面修改的词典。与用户控制的“保存”功能不同,我希望在字典发生更改时将其写入JSON文件。我知道保存的机制,但不知道如何在字典中更改时触发保存。这是否可能,如果可能,如何实现?

您不能使用默认dict类型,但可以使用自定义字典子类或and intercept方法的子类来更改字典,以便触发保存

后者最简单;它将所有修改方法映射到_usetItem_;。您需要在的“抽象方法”列中提供所有方法

以下是我对此类课程的简要描述:

import json
from collections import MutableMapping

class JSONBackedMapping(MutableMapping):
    def __init__(self, filename, initial=None, **kw):
        self._filename = filename
        try:
            # Try and load the file
            self.load()
        except (ValueError, IOError):
            # failure, fall back to the initial object
            self._data = initial or {}
        self._data.update(**kw)

    def load(self):
        with open(self._filename, 'r') as inf:
            self._data = json.load(inf)

    def save(self):
        with open(self._filename, 'w') as outf:
            json.dump(self._data, outf)

    def __repr__(self):
        return '<{}({!r}, {})>'.format(
            type(self).__name__,
            self._filename, self._data)

    def __len__(self):           return len(self._data)
    def __iter__(self):          return iter(self._data)
    def __getitem__(self, item): return self._data[item]

    def __delitem__(self, item):
        del self._data[item]
        self.save()

    def __setitem__(self, item, value):
        self._data[item] = value
        self.save()
这将从给定的文件名加载,如果加载失败,则从初始字典开始加载。您可以添加其他键值对作为关键字参数。对其所做的任何更改都将自动作为JSON保存到给定的文件名:

>>> data = JSONBackedMapping('data.json')
>>> data
<JSONBackedMapping('data.json', {})>
>>> data['foo'] = 'bar'
>>> data['spam'] = ['eggs', 'ham']
>>> print open('data.json').read()
{"foo": "bar", "spam": ["eggs", "ham"]}
>>> del data
>>> data = JSONBackedMapping('data.json')
>>> data
<JSONBackedMapping('data.json', {u'foo': u'bar', u'spam': [u'eggs', u'ham']})>

您不能使用默认的dict类型,但可以使用自定义字典子类或and intercept方法的子类来更改字典,以便触发保存

后者最简单;它将所有修改方法映射到_usetItem_;。您需要在的“抽象方法”列中提供所有方法

以下是我对此类课程的简要描述:

import json
from collections import MutableMapping

class JSONBackedMapping(MutableMapping):
    def __init__(self, filename, initial=None, **kw):
        self._filename = filename
        try:
            # Try and load the file
            self.load()
        except (ValueError, IOError):
            # failure, fall back to the initial object
            self._data = initial or {}
        self._data.update(**kw)

    def load(self):
        with open(self._filename, 'r') as inf:
            self._data = json.load(inf)

    def save(self):
        with open(self._filename, 'w') as outf:
            json.dump(self._data, outf)

    def __repr__(self):
        return '<{}({!r}, {})>'.format(
            type(self).__name__,
            self._filename, self._data)

    def __len__(self):           return len(self._data)
    def __iter__(self):          return iter(self._data)
    def __getitem__(self, item): return self._data[item]

    def __delitem__(self, item):
        del self._data[item]
        self.save()

    def __setitem__(self, item, value):
        self._data[item] = value
        self.save()
这将从给定的文件名加载,如果加载失败,则从初始字典开始加载。您可以添加其他键值对作为关键字参数。对其所做的任何更改都将自动作为JSON保存到给定的文件名:

>>> data = JSONBackedMapping('data.json')
>>> data
<JSONBackedMapping('data.json', {})>
>>> data['foo'] = 'bar'
>>> data['spam'] = ['eggs', 'ham']
>>> print open('data.json').read()
{"foo": "bar", "spam": ["eggs", "ham"]}
>>> del data
>>> data = JSONBackedMapping('data.json')
>>> data
<JSONBackedMapping('data.json', {u'foo': u'bar', u'spam': [u'eggs', u'ham']})>
仅供参考,这正是shelve所做的,尽管不是JSON格式。@roippi:和shelve也使用collections.MutableMapping。仅供参考,这正是shelve所做的,尽管不是JSON格式。@roippi:和shelve也使用collections.MutableMapping。