Использовать JSON
Как и в случае с ответом Пита, мне нравится использовать 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)
и загрузка примерно одинакова:
>>> 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]
Кроме того, загрузка JSON не страдает от тех же проблем безопасности, что shelve
и pickle
, хотя IIRC медленнее, чем pickle.
Если вы хотите писать о каждой операции:
Если вы хотите сэкономить на каждой операции, вы можете создать подкласс 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()
Который вы можете использовать так:
db = DictPersistJSON("db.json")
db["foo"] = "bar" # Will trigger a write
Что крайне неэффективно, но может быстро оторвать вас от земли.