使用Python,我可以保留持久字典并对其进行修改吗?

13 python persistence dictionary object-persistence

所以,我想将字典存储在持久文件中.有没有办法使用常规字典方法来添加,打印或删除该文件中字典中的条目?

似乎我可以使用cPickle存储字典并加载它,但我不知道从哪里拿它.

Ale*_*lli 18

如果您的密钥(不一定是值)是字符串,搁置标准库模块可以非常无缝地执行您想要的操作.


bri*_*ice 8

使用JSON

与Pete的答案类似,我喜欢使用JSON,因为它很好地映射到python数据结构并且非常易读:

保持数据是微不足道的:

>>> import json
>>> db = {'hello': 123, 'foo': [1,2,3,4,5,6], 'bar': {'a': 0, 'b':9}}
>>> fh = open("db.json", 'w')
>>> json.dump(db, fh)
Run Code Online (Sandbox Code Playgroud)

并加载它大致相同:

>>> import json
>>> fh = open("db.json", 'r')
>>> db = json.load(fh)
>>> db
{'hello': 123, 'bar': {'a': 0, 'b': 9}, 'foo': [1, 2, 3, 4, 5, 6]}
>>> del new_db['foo'][3]
>>> new_db['foo']
[1, 2, 3, 5, 6]
Run Code Online (Sandbox Code Playgroud)

此外,JSON加载不从同样的安全问题遭受shelvepickle做,虽然IIRC它比咸菜慢.

如果你想写每个操作:

如果要保存每个操作,可以继承Python dict对象:

import os
import json

class DictPersistJSON(dict):
    def __init__(self, filename, *args, **kwargs):
        self.filename = filename
        self._load();
        self.update(*args, **kwargs)

    def _load(self):
        if os.path.isfile(self.filename) 
           and os.path.getsize(self.filename) > 0:
            with open(self.filename, 'r') as fh:
                self.update(json.load(fh))

    def _dump(self):
        with open(self.filename, 'w') as fh:
            json.dump(self, fh)

    def __getitem__(self, key):
        return dict.__getitem__(self, key)

    def __setitem__(self, key, val):
        dict.__setitem__(self, key, val)
        self._dump()

    def __repr__(self):
        dictrepr = dict.__repr__(self)
        return '%s(%s)' % (type(self).__name__, dictrepr)

    def update(self, *args, **kwargs):
        for k, v in dict(*args, **kwargs).items():
            self[k] = v
        self._dump()
Run Code Online (Sandbox Code Playgroud)

您可以这样使用:

db = DictPersistJSON("db.json")
db["foo"] = "bar" # Will trigger a write
Run Code Online (Sandbox Code Playgroud)

这是非常低效的,但可以让你快速起步.


Amb*_*ber 6

程序加载时从文件中取消,在程序运行时修改为内存中的普通字典,程序退出时将文件修改为文件?不确定你在这里要求的更多.