17db96d56Sopenharmony_ci:mod:`shelve` --- Python object persistence 27db96d56Sopenharmony_ci=========================================== 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci.. module:: shelve 57db96d56Sopenharmony_ci :synopsis: Python object persistence. 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci**Source code:** :source:`Lib/shelve.py` 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci.. index:: pair: module; pickle 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci-------------- 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ciA "shelf" is a persistent, dictionary-like object. The difference with "dbm" 147db96d56Sopenharmony_cidatabases is that the values (not the keys!) in a shelf can be essentially 157db96d56Sopenharmony_ciarbitrary Python objects --- anything that the :mod:`pickle` module can handle. 167db96d56Sopenharmony_ciThis includes most class instances, recursive data types, and objects containing 177db96d56Sopenharmony_cilots of shared sub-objects. The keys are ordinary strings. 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci.. function:: open(filename, flag='c', protocol=None, writeback=False) 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci Open a persistent dictionary. The filename specified is the base filename for 237db96d56Sopenharmony_ci the underlying database. As a side-effect, an extension may be added to the 247db96d56Sopenharmony_ci filename and more than one file may be created. By default, the underlying 257db96d56Sopenharmony_ci database file is opened for reading and writing. The optional *flag* parameter 267db96d56Sopenharmony_ci has the same interpretation as the *flag* parameter of :func:`dbm.open`. 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci By default, pickles created with :data:`pickle.DEFAULT_PROTOCOL` are used 297db96d56Sopenharmony_ci to serialize values. The version of the pickle protocol can be specified 307db96d56Sopenharmony_ci with the *protocol* parameter. 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ci Because of Python semantics, a shelf cannot know when a mutable 337db96d56Sopenharmony_ci persistent-dictionary entry is modified. By default modified objects are 347db96d56Sopenharmony_ci written *only* when assigned to the shelf (see :ref:`shelve-example`). If the 357db96d56Sopenharmony_ci optional *writeback* parameter is set to ``True``, all entries accessed are also 367db96d56Sopenharmony_ci cached in memory, and written back on :meth:`~Shelf.sync` and 377db96d56Sopenharmony_ci :meth:`~Shelf.close`; this can make it handier to mutate mutable entries in 387db96d56Sopenharmony_ci the persistent dictionary, but, if many entries are accessed, it can consume 397db96d56Sopenharmony_ci vast amounts of memory for the cache, and it can make the close operation 407db96d56Sopenharmony_ci very slow since all accessed entries are written back (there is no way to 417db96d56Sopenharmony_ci determine which accessed entries are mutable, nor which ones were actually 427db96d56Sopenharmony_ci mutated). 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci .. versionchanged:: 3.10 457db96d56Sopenharmony_ci :data:`pickle.DEFAULT_PROTOCOL` is now used as the default pickle 467db96d56Sopenharmony_ci protocol. 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci .. versionchanged:: 3.11 497db96d56Sopenharmony_ci Accepts :term:`path-like object` for filename. 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ci .. note:: 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci Do not rely on the shelf being closed automatically; always call 547db96d56Sopenharmony_ci :meth:`~Shelf.close` explicitly when you don't need it any more, or 557db96d56Sopenharmony_ci use :func:`shelve.open` as a context manager:: 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci with shelve.open('spam') as db: 587db96d56Sopenharmony_ci db['eggs'] = 'eggs' 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci.. _shelve-security: 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci.. warning:: 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci Because the :mod:`shelve` module is backed by :mod:`pickle`, it is insecure 657db96d56Sopenharmony_ci to load a shelf from an untrusted source. Like with pickle, loading a shelf 667db96d56Sopenharmony_ci can execute arbitrary code. 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ciShelf objects support most of methods and operations supported by dictionaries 697db96d56Sopenharmony_ci(except copying, constructors and operators ``|`` and ``|=``). This eases the 707db96d56Sopenharmony_citransition from dictionary based scripts to those requiring persistent storage. 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ciTwo additional methods are supported: 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci.. method:: Shelf.sync() 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci Write back all entries in the cache if the shelf was opened with *writeback* 777db96d56Sopenharmony_ci set to :const:`True`. Also empty the cache and synchronize the persistent 787db96d56Sopenharmony_ci dictionary on disk, if feasible. This is called automatically when the shelf 797db96d56Sopenharmony_ci is closed with :meth:`close`. 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci.. method:: Shelf.close() 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci Synchronize and close the persistent *dict* object. Operations on a closed 847db96d56Sopenharmony_ci shelf will fail with a :exc:`ValueError`. 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci.. seealso:: 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci `Persistent dictionary recipe <https://code.activestate.com/recipes/576642/>`_ 907db96d56Sopenharmony_ci with widely supported storage formats and having the speed of native 917db96d56Sopenharmony_ci dictionaries. 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ciRestrictions 957db96d56Sopenharmony_ci------------ 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci .. index:: 987db96d56Sopenharmony_ci pair: module; dbm.ndbm 997db96d56Sopenharmony_ci pair: module; dbm.gnu 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci* The choice of which database package will be used (such as :mod:`dbm.ndbm` or 1027db96d56Sopenharmony_ci :mod:`dbm.gnu`) depends on which interface is available. Therefore it is not 1037db96d56Sopenharmony_ci safe to open the database directly using :mod:`dbm`. The database is also 1047db96d56Sopenharmony_ci (unfortunately) subject to the limitations of :mod:`dbm`, if it is used --- 1057db96d56Sopenharmony_ci this means that (the pickled representation of) the objects stored in the 1067db96d56Sopenharmony_ci database should be fairly small, and in rare cases key collisions may cause 1077db96d56Sopenharmony_ci the database to refuse updates. 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci* The :mod:`shelve` module does not support *concurrent* read/write access to 1107db96d56Sopenharmony_ci shelved objects. (Multiple simultaneous read accesses are safe.) When a 1117db96d56Sopenharmony_ci program has a shelf open for writing, no other program should have it open for 1127db96d56Sopenharmony_ci reading or writing. Unix file locking can be used to solve this, but this 1137db96d56Sopenharmony_ci differs across Unix versions and requires knowledge about the database 1147db96d56Sopenharmony_ci implementation used. 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci 1177db96d56Sopenharmony_ci.. class:: Shelf(dict, protocol=None, writeback=False, keyencoding='utf-8') 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci A subclass of :class:`collections.abc.MutableMapping` which stores pickled 1207db96d56Sopenharmony_ci values in the *dict* object. 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci By default, pickles created with :data:`pickle.DEFAULT_PROTOCOL` are used 1237db96d56Sopenharmony_ci to serialize values. The version of the pickle protocol can be specified 1247db96d56Sopenharmony_ci with the *protocol* parameter. See the :mod:`pickle` documentation for a 1257db96d56Sopenharmony_ci discussion of the pickle protocols. 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci If the *writeback* parameter is ``True``, the object will hold a cache of all 1287db96d56Sopenharmony_ci entries accessed and write them back to the *dict* at sync and close times. 1297db96d56Sopenharmony_ci This allows natural operations on mutable entries, but can consume much more 1307db96d56Sopenharmony_ci memory and make sync and close take a long time. 1317db96d56Sopenharmony_ci 1327db96d56Sopenharmony_ci The *keyencoding* parameter is the encoding used to encode keys before they 1337db96d56Sopenharmony_ci are used with the underlying dict. 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci A :class:`Shelf` object can also be used as a context manager, in which 1367db96d56Sopenharmony_ci case it will be automatically closed when the :keyword:`with` block ends. 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci .. versionchanged:: 3.2 1397db96d56Sopenharmony_ci Added the *keyencoding* parameter; previously, keys were always encoded in 1407db96d56Sopenharmony_ci UTF-8. 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci .. versionchanged:: 3.4 1437db96d56Sopenharmony_ci Added context manager support. 1447db96d56Sopenharmony_ci 1457db96d56Sopenharmony_ci .. versionchanged:: 3.10 1467db96d56Sopenharmony_ci :data:`pickle.DEFAULT_PROTOCOL` is now used as the default pickle 1477db96d56Sopenharmony_ci protocol. 1487db96d56Sopenharmony_ci 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci.. class:: BsdDbShelf(dict, protocol=None, writeback=False, keyencoding='utf-8') 1517db96d56Sopenharmony_ci 1527db96d56Sopenharmony_ci A subclass of :class:`Shelf` which exposes :meth:`first`, :meth:`!next`, 1537db96d56Sopenharmony_ci :meth:`previous`, :meth:`last` and :meth:`set_location` which are available 1547db96d56Sopenharmony_ci in the third-party :mod:`bsddb` module from `pybsddb 1557db96d56Sopenharmony_ci <https://www.jcea.es/programacion/pybsddb.htm>`_ but not in other database 1567db96d56Sopenharmony_ci modules. The *dict* object passed to the constructor must support those 1577db96d56Sopenharmony_ci methods. This is generally accomplished by calling one of 1587db96d56Sopenharmony_ci :func:`bsddb.hashopen`, :func:`bsddb.btopen` or :func:`bsddb.rnopen`. The 1597db96d56Sopenharmony_ci optional *protocol*, *writeback*, and *keyencoding* parameters have the same 1607db96d56Sopenharmony_ci interpretation as for the :class:`Shelf` class. 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci 1637db96d56Sopenharmony_ci.. class:: DbfilenameShelf(filename, flag='c', protocol=None, writeback=False) 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_ci A subclass of :class:`Shelf` which accepts a *filename* instead of a dict-like 1667db96d56Sopenharmony_ci object. The underlying file will be opened using :func:`dbm.open`. By 1677db96d56Sopenharmony_ci default, the file will be created and opened for both read and write. The 1687db96d56Sopenharmony_ci optional *flag* parameter has the same interpretation as for the :func:`.open` 1697db96d56Sopenharmony_ci function. The optional *protocol* and *writeback* parameters have the same 1707db96d56Sopenharmony_ci interpretation as for the :class:`Shelf` class. 1717db96d56Sopenharmony_ci 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ci.. _shelve-example: 1747db96d56Sopenharmony_ci 1757db96d56Sopenharmony_ciExample 1767db96d56Sopenharmony_ci------- 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ciTo summarize the interface (``key`` is a string, ``data`` is an arbitrary 1797db96d56Sopenharmony_ciobject):: 1807db96d56Sopenharmony_ci 1817db96d56Sopenharmony_ci import shelve 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ci d = shelve.open(filename) # open -- file may get suffix added by low-level 1847db96d56Sopenharmony_ci # library 1857db96d56Sopenharmony_ci 1867db96d56Sopenharmony_ci d[key] = data # store data at key (overwrites old data if 1877db96d56Sopenharmony_ci # using an existing key) 1887db96d56Sopenharmony_ci data = d[key] # retrieve a COPY of data at key (raise KeyError 1897db96d56Sopenharmony_ci # if no such key) 1907db96d56Sopenharmony_ci del d[key] # delete data stored at key (raises KeyError 1917db96d56Sopenharmony_ci # if no such key) 1927db96d56Sopenharmony_ci 1937db96d56Sopenharmony_ci flag = key in d # true if the key exists 1947db96d56Sopenharmony_ci klist = list(d.keys()) # a list of all existing keys (slow!) 1957db96d56Sopenharmony_ci 1967db96d56Sopenharmony_ci # as d was opened WITHOUT writeback=True, beware: 1977db96d56Sopenharmony_ci d['xx'] = [0, 1, 2] # this works as expected, but... 1987db96d56Sopenharmony_ci d['xx'].append(3) # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]! 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci # having opened d without writeback=True, you need to code carefully: 2017db96d56Sopenharmony_ci temp = d['xx'] # extracts the copy 2027db96d56Sopenharmony_ci temp.append(5) # mutates the copy 2037db96d56Sopenharmony_ci d['xx'] = temp # stores the copy right back, to persist it 2047db96d56Sopenharmony_ci 2057db96d56Sopenharmony_ci # or, d=shelve.open(filename,writeback=True) would let you just code 2067db96d56Sopenharmony_ci # d['xx'].append(5) and have it work as expected, BUT it would also 2077db96d56Sopenharmony_ci # consume more memory and make the d.close() operation slower. 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci d.close() # close it 2107db96d56Sopenharmony_ci 2117db96d56Sopenharmony_ci 2127db96d56Sopenharmony_ci.. seealso:: 2137db96d56Sopenharmony_ci 2147db96d56Sopenharmony_ci Module :mod:`dbm` 2157db96d56Sopenharmony_ci Generic interface to ``dbm``-style databases. 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci Module :mod:`pickle` 2187db96d56Sopenharmony_ci Object serialization used by :mod:`shelve`. 2197db96d56Sopenharmony_ci 220