shelve.py
来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 159 行
PY
159 行
"""Manage shelves of pickled objects.A "shelf" is a persistent, dictionary-like object. The differencewith dbm databases is that the values (not the keys!) in a shelf canbe essentially arbitrary Python objects -- anything that the "pickle"module can handle. This includes most class instances, recursive datatypes, and objects containing lots of shared sub-objects. The keysare ordinary strings.To summarize the interface (key is a string, data is an arbitraryobject): import shelve d = shelve.open(filename) # open, with (g)dbm filename -- no suffix d[key] = data # store data at key (overwrites old data if # using an existing key) data = d[key] # retrieve data at key (raise KeyError if no # such key) del d[key] # delete data stored at key (raises KeyError # if no such key) flag = d.has_key(key) # true if the key exists list = d.keys() # a list of all existing keys (slow!) d.close() # close itDependent on the implementation, closing a persistent dictionary mayor may not be necessary to flush changes to disk."""# Try using cPickle and cStringIO if available.try: from cPickle import Pickler, Unpicklerexcept ImportError: from pickle import Pickler, Unpicklertry: from cStringIO import StringIOexcept ImportError: from StringIO import StringIO__all__ = ["Shelf","BsdDbShelf","DbfilenameShelf","open"]class Shelf: """Base class for shelf implementations. This is initialized with a dictionary-like object. See the module's __doc__ string for an overview of the interface. """ def __init__(self, dict): self.dict = dict def keys(self): return self.dict.keys() def __len__(self): return len(self.dict) def has_key(self, key): return self.dict.has_key(key) def get(self, key, default=None): if self.dict.has_key(key): return self[key] return default def __getitem__(self, key): f = StringIO(self.dict[key]) return Unpickler(f).load() def __setitem__(self, key, value): f = StringIO() p = Pickler(f) p.dump(value) self.dict[key] = f.getvalue() def __delitem__(self, key): del self.dict[key] def close(self): try: self.dict.close() except: pass self.dict = 0 def __del__(self): self.close() def sync(self): if hasattr(self.dict, 'sync'): self.dict.sync()class BsdDbShelf(Shelf): """Shelf implementation using the "BSD" db interface. This adds methods first(), next(), previous(), last() and set_location() that have no counterpart in [g]dbm databases. The actual database must be opened using one of the "bsddb" modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or bsddb.rnopen) and passed to the constructor. See the module's __doc__ string for an overview of the interface. """ def __init__(self, dict): Shelf.__init__(self, dict) def set_location(self, key): (key, value) = self.dict.set_location(key) f = StringIO(value) return (key, Unpickler(f).load()) def next(self): (key, value) = self.dict.next() f = StringIO(value) return (key, Unpickler(f).load()) def previous(self): (key, value) = self.dict.previous() f = StringIO(value) return (key, Unpickler(f).load()) def first(self): (key, value) = self.dict.first() f = StringIO(value) return (key, Unpickler(f).load()) def last(self): (key, value) = self.dict.last() f = StringIO(value) return (key, Unpickler(f).load())class DbfilenameShelf(Shelf): """Shelf implementation using the "anydbm" generic dbm interface. This is initialized with the filename for the dbm database. See the module's __doc__ string for an overview of the interface. """ def __init__(self, filename, flag='c'): import anydbm Shelf.__init__(self, anydbm.open(filename, flag))def open(filename, flag='c'): """Open a persistent dictionary for reading and writing. Argument is the filename for the dbm database. See the module's __doc__ string for an overview of the interface. """ return DbfilenameShelf(filename, flag)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?