11.1. pickle — Python object serialization¶
The pickle module implements a fundamental, but powerful algorithm for
serializing and de-serializing a Python object structure. “Pickling” is the
process whereby a Python object hierarchy is converted into a byte stream, and
“unpickling” is the inverse operation, whereby a byte stream is converted back
into an object hierarchy. Pickling (and unpickling) is alternatively known as
“serialization”, “marshalling,” 1 or “flattening”, however, to avoid
confusion, the terms used here are “pickling” and “unpickling”.
This documentation describes both the pickle module and the
cPickle module.
Warning
The pickle module is not secure against erroneous or maliciously
constructed data. Never unpickle data received from an untrusted or
unauthenticated source.
11.1.1. Relationship to other Python modules¶
The pickle module has an optimized cousin called the cPickle
module. As its name implies, cPickle is written in C, so it can be up to
1000 times faster than pickle. However it does not support subclassing
of the Pickler() and Unpickler() classes, because in cPickle
these are functions, not classes. Most applications have no need for this
functionality, and can benefit from the improved performance of cPickle.
Other than that, the interfaces of the two modules are nearly identical; the
common interface is described in this manual and differences are pointed out
where necessary. In the following discussions, we use the term “pickle” to
collectively describe the pickle and cPickle modules.
The data streams the two modules produce are guaranteed to be interchangeable.
Python has a more primitive serialization module called marshal, but in
general pickle should always be the preferred way to serialize Python
objects. marshal exists primarily to support Python’s .pyc
files.
The pickle module differs from marshal in several significant ways:
The
picklemodule keeps track of the objects it has already serialized, so that later references to the same object won’t be serialized again.marshaldoesn’t do this.This has implications both for recursive objects and object sharing. Recursive objects are objects that contain references to themselves. These are not handled by marshal, and in fact, attempting to marshal recursive objects will crash your Python interpreter. Object sharing happens when there are multiple references to the same object in different places in the object hierarchy being serialized.
picklestores such objects only once, and ensures that all other references point to the master copy. Shared objects remain shared, which can be very important for mutable objects.marshalcannot be used to serialize user-defined classes and their instances.picklecan save and restore class instances transparently, however the class definition must be importable and live in the same module as when the object was stored.The
marshalserialization format is not guaranteed to be portable across Python versions. Because its primary job in life is to support.pycfiles, the Python implementers reserve the right to change the serialization format in non-backwards compatible ways should the need arise. Thepickleserialization format is guaranteed to be backwards compatible across Python releases.
Note that serialization is a more primitive notion than persistence; although
pickle reads and writes file objects, it does not handle the issue of
naming persistent objects, nor the (even more complicated) issue of concurrent
access to persistent objects. The pickle module can transform a complex
object into a byte stream and it can transform the byte stream into an object
with the same internal structure. Perhaps the most obvious thing to do with
these byte streams is to write them onto a file, but it is also conceivable to
send them across a network or store them in a database. The module
shelve provides a simple interface to pickle and unpickle objects on
DBM-style database files.
11.1.2. Data stream format¶
The data format used by pickle is Python-specific. This has the
advantage that there are no restrictions imposed by external standards such as
XDR (which can’t represent pointer sharing); however it means that non-Python
programs may not be able to reconstruct pickled Python objects.
By default, the pickle data format uses a printable ASCII representation.
This is slightly more voluminous than a binary representation. The big
advantage of using printable ASCII (and of some other characteristics of
pickle’s representation) is that for debugging or recovery purposes it is
possible for a human to read the pickled file with a standard text editor.
There are currently 3 different protocols which can be used for pickling.
Protocol version 0 is the original ASCII protocol and is backwards compatible with earlier versions of Python.
Protocol version 1 is the old binary format which is also compatible with earlier versions of Python.
Protocol version 2 was introduced in Python 2.3. It provides much more efficient pickling of new-style classes.
Refer to PEP 307 for more information.
If a protocol is not specified, protocol 0 is used. If protocol is specified
as a negative value or HIGHEST_PROTOCOL, the highest protocol version
available will be used.
Changed in version 2.3: Introduced the protocol parameter.
A binary format, which is slightly more efficient, can be chosen by specifying a protocol version >= 1.
11.1.3. Usage¶
To serialize an object hierarchy, you first create a pickler, then you call the
pickler’s dump() method. To de-serialize a data stream, you first create
an unpickler, then you call the unpickler’s load() method. The
pickle module provides the following constant:
-
pickle.HIGHEST_PROTOCOL¶ The highest protocol version available. This value can be passed as a protocol value.
New in version 2.3.
Note
Be sure to always open pickle files created with protocols >= 1 in binary mode. For the old ASCII-based pickle protocol 0 you can use either text mode or binary mode as long as you stay consistent.
A pickle file written with protocol 0 in binary mode will contain lone linefeeds as line terminators and therefore will look “funny” when viewed in Notepad or other editors which do not support this format.
The pickle module provides the following functions to make the pickling
process more convenient:
-
pickle.dump(obj, file[, protocol])¶ Write a pickled representation of obj to the open file object file. This is equivalent to
Pickler(file, protocol).dump(obj).If the protocol parameter is omitted, protocol 0 is used. If protocol is specified as a negative value or
HIGHEST_PROTOCOL, the highest protocol version will be used.Changed in version 2.3: Introduced the protocol parameter.
file must have a
write()method that accepts a single string argument. It can thus be a file object opened for writing, aStringIOobject, or any other custom object that meets this interface.
-
pickle.load(file)¶ Read a string from the open file object file and interpret it as a pickle data stream, reconstructing and returning the original object hierarchy. This is equivalent to
Unpickler(file).load().file must have two methods, a
read()method that takes an integer argument, and areadline()method that requires no arguments. Both methods should return a string. Thus file can be a file object opened for reading, aStringIOobject, or any other custom object that meets this interface.This function automatically determines whether the data stream was written in binary mode or not.
-
pickle.dumps(obj[, protocol])¶ Return the pickled representation of the object as a string, instead of writing it to a file.
If the protocol parameter is omitted, protocol 0 is used. If protocol is specified as a negative value or
HIGHEST_PROTOCOL, the highest protocol version will be used.Changed in version 2.3: The protocol parameter was added.
-
pickle.loads(string)¶ Read a pickled object hierarchy from a string. Characters in the string past the pickled object’s representation are ignored.
The pickle module also defines three exceptions:
-
exception
pickle.PickleError¶ A common base class for the other exceptions defined below. This inherits from
Exception.
-
exception
pickle.PicklingError¶ This exception is raised when an unpicklable object is passed to the
dump()method.
-
exception
pickle.UnpicklingError¶ This exception is raised when there is a problem unpickling an object. Note that other exceptions may also be raised during unpickling, including (but not necessarily limited to)
AttributeError,EOFError,ImportError, andIndexError.
The pickle module also exports two callables 2, Pickler and
Unpickler:
-
class
pickle.Pickler(file[, protocol])¶ This takes a file-like object to which it will write a pickle data stream.
If the protocol parameter is omitted, protocol 0 is used. If protocol is specified as a negative value or
HIGHEST_PROTOCOL, the highest protocol version will be used.Changed in version 2.3: Introduced the protocol parameter.
file must have a
write()method that accepts a single string argument. It can thus be an open file object, aStringIOobject, or any other custom object that meets this interface.Picklerobjects define one (or two) public methods:-
dump(obj)¶ Write a pickled representation of obj to the open file object given in the constructor. Either the binary or ASCII format will be used, depending on the value of the protocol argument passed to the constructor.
-
clear_memo()¶ Clears the pickler’s “memo”. The memo is the data structure that remembers which objects the pickler has already seen, so that shared or recursive objects pickled by reference and not by value. This method is useful when re-using picklers.
Note
Prior to Python 2.3,
clear_memo()was only available on the picklers created bycPickle. In thepicklemodule, picklers have an instance variable calledmemowhich is a Python dictionary. So to clear the memo for apicklemodule pickler, you could do the following:mypickler.memo.clear()
Code that does not need to support older versions of Python should simply use
clear_memo().
-
It is possible to make multiple calls to the dump() method of the same
Pickler instance. These must then be matched to the same number of
calls to the load() method of the corresponding Unpickler
instance. If the same object is pickled by multiple
