13.1.7 例

いちばん単純には、dump()load() を 使用してください。自己参照リストが正しく pickle 化およびリストアされる ことに注目してください。

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()

以下の例は pickle 化された結果のデータを読み込みます。 pickle を含むデータを読み込む場合、ファイルはバイナリモードで オープンしなければいけません。これは ASCII 形式とバイナリ形式の どちらが使われているかは分からないからです。

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()

より大きな例で、クラスを pickle 化する挙動を変更するやり方を示します。 TextReader クラスはテキストファイルを開き、 readline() メソッドが呼ばれるたびに行番号と行の内容を 返します。TextReader インスタンスが pickle 化された場合、 ファイルオブジェクト 以外の 全ての属性が保存されます。 インスタンスが unpickle 化された際、ファイルは再度開かれ、 以前のファイル位置から読み出しを再開します。上記の動作を 実装するために、__setstat__() および __getstate__() メソッドが使われています。

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

使用例は以下のようになるでしょう:

>>> 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'))

pickle が Python プロセス間でうまく働くことを見たい なら、先に進む前に他の Python セッションを開始してください。 以下の振る舞いは同じプロセスでも新たなプロセスでも起こります。

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

参考:

copy_reg:モジュール
拡張型を登録するための Pickle インタフェース構成機構。.

shelve:モジュール
オブジェクトのインデクス付きデータベース; pickle を使います。.

copy:モジュール
オブジェクトの浅いコピーおよび深いコピー。.

marshal:モジュール
高いパフォーマンスを持つ組み込み型整列化機構。.

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。