##
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`:モジュール
  高いパフォーマンスを持つ組み込み型整列化機構。.