blob: b60a54834bf5f94cd960d87fc1c7bc081a389f4b [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`shelve` --- Python object persistence
2===========================================
3
4.. module:: shelve
5 :synopsis: Python object persistence.
6
7
8.. index:: module: pickle
9
Raymond Hettinger10480942011-01-10 03:26:08 +000010**Source code:** :source:`Lib/shelve.py`
11
Raymond Hettinger4f707fd2011-01-10 19:54:11 +000012--------------
13
Georg Brandl116aa622007-08-15 14:28:22 +000014A "shelf" is a persistent, dictionary-like object. The difference with "dbm"
15databases is that the values (not the keys!) in a shelf can be essentially
16arbitrary Python objects --- anything that the :mod:`pickle` module can handle.
17This includes most class instances, recursive data types, and objects containing
18lots of shared sub-objects. The keys are ordinary strings.
19
20
Georg Brandl18244152009-09-02 20:34:52 +000021.. function:: open(filename, flag='c', protocol=None, writeback=False)
Georg Brandl116aa622007-08-15 14:28:22 +000022
23 Open a persistent dictionary. The filename specified is the base filename for
24 the underlying database. As a side-effect, an extension may be added to the
25 filename and more than one file may be created. By default, the underlying
26 database file is opened for reading and writing. The optional *flag* parameter
Georg Brandl0a7ac7d2008-05-26 10:29:35 +000027 has the same interpretation as the *flag* parameter of :func:`dbm.open`.
Georg Brandl116aa622007-08-15 14:28:22 +000028
Raymond Hettinger85602262009-02-03 04:19:10 +000029 By default, version 3 pickles are used to serialize values. The version of the
Georg Brandl116aa622007-08-15 14:28:22 +000030 pickle protocol can be specified with the *protocol* parameter.
31
R. David Murrayff85bca2009-05-12 01:40:16 +000032 Because of Python semantics, a shelf cannot know when a mutable
33 persistent-dictionary entry is modified. By default modified objects are
R. David Murrayddb3ed02010-02-11 02:42:19 +000034 written *only* when assigned to the shelf (see :ref:`shelve-example`). If the
35 optional *writeback* parameter is set to *True*, all entries accessed are also
36 cached in memory, and written back on :meth:`~Shelf.sync` and
37 :meth:`~Shelf.close`; this can make it handier to mutate mutable entries in
38 the persistent dictionary, but, if many entries are accessed, it can consume
39 vast amounts of memory for the cache, and it can make the close operation
40 very slow since all accessed entries are written back (there is no way to
41 determine which accessed entries are mutable, nor which ones were actually
42 mutated).
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +000043
44 .. note::
45
46 Do not rely on the shelf being closed automatically; always call
Ezio Melottid23c0a82013-02-01 05:01:50 +020047 :meth:`~Shelf.close` explicitly when you don't need it any more, or
48 use :func:`shelve.open` as a context manager::
49
50 with shelve.open('spam') as db:
51 db['eggs'] = 'eggs'
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +000052
Georg Brandl7716ca62010-10-17 09:37:54 +000053.. warning::
54
55 Because the :mod:`shelve` module is backed by :mod:`pickle`, it is insecure
56 to load a shelf from an untrusted source. Like with pickle, loading a shelf
57 can execute arbitrary code.
Georg Brandl116aa622007-08-15 14:28:22 +000058
Benjamin Peterson25c95f12009-05-08 20:42:26 +000059Shelf objects support all methods supported by dictionaries. This eases the
Georg Brandl116aa622007-08-15 14:28:22 +000060transition from dictionary based scripts to those requiring persistent storage.
61
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +000062Two additional methods are supported:
Georg Brandl116aa622007-08-15 14:28:22 +000063
64.. method:: Shelf.sync()
65
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +000066 Write back all entries in the cache if the shelf was opened with *writeback*
67 set to :const:`True`. Also empty the cache and synchronize the persistent
68 dictionary on disk, if feasible. This is called automatically when the shelf
69 is closed with :meth:`close`.
70
71.. method:: Shelf.close()
72
73 Synchronize and close the persistent *dict* object. Operations on a closed
74 shelf will fail with a :exc:`ValueError`.
75
Georg Brandl116aa622007-08-15 14:28:22 +000076
Raymond Hettinger65c9eb22009-04-04 05:39:52 +000077.. seealso::
78
79 `Persistent dictionary recipe <http://code.activestate.com/recipes/576642/>`_
80 with widely supported storage formats and having the speed of native
81 dictionaries.
82
Georg Brandl116aa622007-08-15 14:28:22 +000083
84Restrictions
85------------
86
87 .. index::
Georg Brandl0a7ac7d2008-05-26 10:29:35 +000088 module: dbm.ndbm
89 module: dbm.gnu
Georg Brandl116aa622007-08-15 14:28:22 +000090
Benjamin Peterson9a46cab2008-09-08 02:49:30 +000091* The choice of which database package will be used (such as :mod:`dbm.ndbm` or
92 :mod:`dbm.gnu`) depends on which interface is available. Therefore it is not
93 safe to open the database directly using :mod:`dbm`. The database is also
94 (unfortunately) subject to the limitations of :mod:`dbm`, if it is used ---
Georg Brandl116aa622007-08-15 14:28:22 +000095 this means that (the pickled representation of) the objects stored in the
Benjamin Peterson9a46cab2008-09-08 02:49:30 +000096 database should be fairly small, and in rare cases key collisions may cause
97 the database to refuse updates.
Georg Brandl116aa622007-08-15 14:28:22 +000098
Georg Brandl116aa622007-08-15 14:28:22 +000099* The :mod:`shelve` module does not support *concurrent* read/write access to
100 shelved objects. (Multiple simultaneous read accesses are safe.) When a
101 program has a shelf open for writing, no other program should have it open for
102 reading or writing. Unix file locking can be used to solve this, but this
103 differs across Unix versions and requires knowledge about the database
104 implementation used.
105
106
Georg Brandl732324a2010-12-04 11:12:43 +0000107.. class:: Shelf(dict, protocol=None, writeback=False, keyencoding='utf-8')
Georg Brandl116aa622007-08-15 14:28:22 +0000108
Georg Brandlc7723722008-05-26 17:47:11 +0000109 A subclass of :class:`collections.MutableMapping` which stores pickled values
110 in the *dict* object.
Georg Brandl116aa622007-08-15 14:28:22 +0000111
112 By default, version 0 pickles are used to serialize values. The version of the
113 pickle protocol can be specified with the *protocol* parameter. See the
114 :mod:`pickle` documentation for a discussion of the pickle protocols.
115
Georg Brandl116aa622007-08-15 14:28:22 +0000116 If the *writeback* parameter is ``True``, the object will hold a cache of all
117 entries accessed and write them back to the *dict* at sync and close times.
118 This allows natural operations on mutable entries, but can consume much more
119 memory and make sync and close take a long time.
120
Georg Brandl732324a2010-12-04 11:12:43 +0000121 The *keyencoding* parameter is the encoding used to encode keys before they
122 are used with the underlying dict.
Georg Brandl116aa622007-08-15 14:28:22 +0000123
Ezio Melottid23c0a82013-02-01 05:01:50 +0200124 :class:`Shelf` objects can also be used as context managers.
125
126 .. versionchanged:: 3.2
127 Added the *keyencoding* parameter; previously, keys were always encoded in
Georg Brandl732324a2010-12-04 11:12:43 +0000128 UTF-8.
129
Ezio Melottid23c0a82013-02-01 05:01:50 +0200130 .. versionchanged:: 3.4
131 Added context manager support.
132
Georg Brandl732324a2010-12-04 11:12:43 +0000133
134.. class:: BsdDbShelf(dict, protocol=None, writeback=False, keyencoding='utf-8')
Georg Brandl116aa622007-08-15 14:28:22 +0000135
Georg Brandl502d9a52009-07-26 15:02:41 +0000136 A subclass of :class:`Shelf` which exposes :meth:`first`, :meth:`!next`,
Georg Brandl1158a332009-06-04 09:30:30 +0000137 :meth:`previous`, :meth:`last` and :meth:`set_location` which are available
138 in the third-party :mod:`bsddb` module from `pybsddb
139 <http://www.jcea.es/programacion/pybsddb.htm>`_ but not in other database
140 modules. The *dict* object passed to the constructor must support those
141 methods. This is generally accomplished by calling one of
142 :func:`bsddb.hashopen`, :func:`bsddb.btopen` or :func:`bsddb.rnopen`. The
Georg Brandl732324a2010-12-04 11:12:43 +0000143 optional *protocol*, *writeback*, and *keyencoding* parameters have the same
144 interpretation as for the :class:`Shelf` class.
Georg Brandl116aa622007-08-15 14:28:22 +0000145
146
Georg Brandl18244152009-09-02 20:34:52 +0000147.. class:: DbfilenameShelf(filename, flag='c', protocol=None, writeback=False)
Georg Brandl116aa622007-08-15 14:28:22 +0000148
149 A subclass of :class:`Shelf` which accepts a *filename* instead of a dict-like
Georg Brandl0a7ac7d2008-05-26 10:29:35 +0000150 object. The underlying file will be opened using :func:`dbm.open`. By
Georg Brandl116aa622007-08-15 14:28:22 +0000151 default, the file will be created and opened for both read and write. The
Georg Brandl502d9a52009-07-26 15:02:41 +0000152 optional *flag* parameter has the same interpretation as for the :func:`.open`
Georg Brandl116aa622007-08-15 14:28:22 +0000153 function. The optional *protocol* and *writeback* parameters have the same
154 interpretation as for the :class:`Shelf` class.
155
156
R. David Murrayff85bca2009-05-12 01:40:16 +0000157.. _shelve-example:
158
Georg Brandl116aa622007-08-15 14:28:22 +0000159Example
160-------
161
162To summarize the interface (``key`` is a string, ``data`` is an arbitrary
163object)::
164
165 import shelve
166
167 d = shelve.open(filename) # open -- file may get suffix added by low-level
168 # library
169
170 d[key] = data # store data at key (overwrites old data if
171 # using an existing key)
172 data = d[key] # retrieve a COPY of data at key (raise KeyError if no
173 # such key)
174 del d[key] # delete data stored at key (raises KeyError
175 # if no such key)
Ezio Melotti8f7649e2009-09-13 04:48:45 +0000176 flag = key in d # true if the key exists
177 klist = list(d.keys()) # a list of all existing keys (slow!)
Georg Brandl116aa622007-08-15 14:28:22 +0000178
179 # as d was opened WITHOUT writeback=True, beware:
Antoine Pitrou631507d2011-02-07 23:10:33 +0000180 d['xx'] = [0, 1, 2] # this works as expected, but...
181 d['xx'].append(3) # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]!
Georg Brandl116aa622007-08-15 14:28:22 +0000182
183 # having opened d without writeback=True, you need to code carefully:
184 temp = d['xx'] # extracts the copy
185 temp.append(5) # mutates the copy
186 d['xx'] = temp # stores the copy right back, to persist it
187
188 # or, d=shelve.open(filename,writeback=True) would let you just code
189 # d['xx'].append(5) and have it work as expected, BUT it would also
190 # consume more memory and make the d.close() operation slower.
191
192 d.close() # close it
193
194
195.. seealso::
196
Georg Brandl0a7ac7d2008-05-26 10:29:35 +0000197 Module :mod:`dbm`
198 Generic interface to ``dbm``-style databases.
Georg Brandl116aa622007-08-15 14:28:22 +0000199
Georg Brandl116aa622007-08-15 14:28:22 +0000200 Module :mod:`pickle`
201 Object serialization used by :mod:`shelve`.
202