いちばん単純には、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."'
参考:
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。