Python Library Reference
Previous: Up: 13.1 pickle Next:


13.1.7 Example

For the simplest code, use the dump() and load() functions. Note that a self-referencing list is pickled and restored correctly.

import pickle
data1 = {'a': [1, 2.0, 3, 4+6j],
 'b': ('string', u'Unicode string'),
 'c': None}
selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)
output = open('data.pkl', 'wb')
# Pickle dictionary using protocol 0.
pickle.dump(data1, output)
# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)
output.close()

The following example reads the resulting pickled data. When reading a pickle-containing file, you should open the file in binary mode because you can't be sure if the ASCII or binary format was used.

import pprint, pickle
pkl_file = open('data.pkl', 'rb')
data1 = pickle.load(pkl_file)
pprint.pprint(data1)
data2 = pickle.load(pkl_file)
pprint.pprint(data2)
pkl_file.close()

Here's a larger example that shows how to modify pickling behavior for a class. The TextReader class opens a text file, and returns the line number and line contents each time its readline() method is called. If a TextReader instance is pickled, all attributes except the file object member are saved. When the instance is unpickled, the file is reopened, and reading resumes from the last location. The __setstate__() and __getstate__() methods are used to implement this behavior.

class TextReader:
 """Print and number lines in a text file."""
 def __init__(self, file):
 self.file = file
 self.fh = open(file)
 self.lineno = 0
 def readline(self):
 self.lineno = self.lineno + 1
 line = self.fh.readline()
 if not line:
 return None
 if line.endswith("\n"):
 line = line[:-1]
 return "%d: %s" % (self.lineno, line)
 def __getstate__(self):
 odict = self.__dict__.copy() # copy the dict since we change it
 del odict['fh'] # remove filehandle entry
 return odict
 def __setstate__(self,dict):
 fh = open(dict['file']) # reopen file
 count = dict['lineno'] # read from file...
 while count: # until line count is restored
 fh.readline()
 count = count - 1
 self.__dict__.update(dict) # update attributes
 self.fh = fh # save the file object

A sample usage might be something like this:

>>> import TextReader
>>> obj = TextReader.TextReader("TextReader.py")
>>> obj.readline()
'1: #!/usr/local/bin/python'
>>> # (more invocations of obj.readline() here)
... obj.readline()
'7: class TextReader:'
>>> import pickle
>>> pickle.dump(obj,open('save.p','w'))

If you want to see that pickle works across Python processes, start another Python session, before continuing. What follows can happen from either the same process or a new process.

>>> import pickle
>>> reader = pickle.load(open('save.p'))
>>> reader.readline()
'8: "Print and number lines in a text file."'

See Also:

Module copy_reg :
Pickle interface constructor registration for extension types.

Module shelve :
Indexed databases of objects; uses pickle.

Module copy :
Shallow and deep object copying.

Module marshal :
High-performance serialization of built-in types.


Python Library Reference
Previous: Up: 13.1 pickle Next:

Release 2.5.2, documentation updated on 21st February, 2008.
See About this document... for information on suggesting changes.

AltStyle によって変換されたページ (->オリジナル) /