27

いくつかのピクルされたオブジェクト (実際にはタプル) をファイルにダンプするメソッドがあります。

それらを 1 つのリストに入れたくありません。同じファイルに何度もダンプしたいのです。私の問題は、オブジェクトを再度ロードするにはどうすればよいですか? 1 番目と 2 番目のオブジェクトの長さは 1 行だけなので、これは readlines で機能します。しかし、他のすべてはより長いです。やってみると当然

myob = cpickle.load(g1.readlines()[2])

ここで、g1 はファイルです。ピクルされたオブジェクトが 1 行より長いため、EOF エラーが発生します。ピクルス化されたオブジェクトだけを取得する方法はありますか?

4

3 に答える 3

80

ファイルハンドルを pickle に直接渡すと、必要な結果が得られます。

import pickle

# write a file
f = open("example", "w")
pickle.dump(["hello", "world"], f)
pickle.dump([2, 3], f)
f.close()

f = open("example", "r")
value1 = pickle.load(f)
value2 = pickle.load(f)
f.close()

pickle.dumpファイルの末尾に追加されるため、複数回呼び出して複数の値を書き込むことができます。

pickle.loadファイルから最初の値を取得するのに十分なだけを読み取り、ファイルハンドルを開いたままにして、ファイル内の次のオブジェクトの先頭を指します。2 番目の呼び出しは、2 番目のオブジェクトを読み取り、ファイル ポインターをファイルの末尾に残します。3 番目の呼び出しは、期待どおりに失敗しEOFErrorます。

この例ではプレーン オールドを使用pickleしましたが、この手法はcPickle.

于 2013-03-17T16:55:44.737 に答える
23

最善の方法は、データを保存する前に単一のオブジェクトにパックし、ロード後にアンパックすることだと思います。you can use dict alsoタプルを container( )として使用する例を次に示します。

a = [1,2]
b = [3,4]

with open("tmp.pickle", "wb") as f:
    pickle.dump((a,b), f)

with open("tmp.pickle", "rb") as f:
    a,b = pickle.load(f) 
于 2014-04-14T09:14:33.257 に答える
2

それらをファイルの行として読み戻そうとしないでくださいpickle.load()。必要なオブジェクトの数だけです。その例については、 Python でオブジェクトを保存する方法という質問に対する私の回答を参照してください。

于 2013-03-17T16:54:20.833 に答える