web-dev-qa-db-ja.com

ファイルにディル(ピクルス)する方法は?

質問は少し基本的に思えるかもしれませんが、インターネットで理解できることは何も見つかりませんでした。ディルで漬けたものをどのように保存しますか?

私は自分の構成を保存するためにここまで来ました(カスタムクラスも含むパンダDataFrame):

import dill
dill_file = open("data/2017-02-10_21:43_resultstatsDF", "wb")
dill_file.write(dill.dumps(resultstatsDF))
dill_file.close()

そして読書のために

dill_file = open("data/2017-02-10_21:43_resultstatsDF", "rb")
resultstatsDF_out = dill.load(dill_file.read())
dill_file.close()

しかし、私は読んでいるときにエラーが発生します

TypeError: file must have 'read' and 'readline' attributes

どうすればよいですか?


今後の読者のための編集:この方法を(私のDataFrameをピクルスにするために)しばらく使用した後、今はそうすることを控えています。結局のところ、異なるプログラムバージョン(dillファイルに格納されている可能性のあるオブジェクトを含む)では、ピクルされたファイルを回復できない可能性があります。保存したいすべてのものが文字列として(可能な限り効率的に)表現できることを確認します-実際には人間が読める文字列です。現在、データをCSVとして保存しています。 CSVセル内のオブジェクトは、JSON形式で表される場合があります。そうすることで、私のファイルが今後数ヶ月および数年のうちに読めるようになります。コードが変更されても、文字列を解析してエンコーダーを書き換えることができ、CSVを手動で検査して理解できます。

9
Make42

readなしのファイルを指定してください:

resultstatsDF_out = dill.load(dill_file)

次のようにファイルにディルすることもできます:

with open("data/2017-02-10_21:43_resultstatsDF", "wb") as dill_file:
    dill.dump(resultstatsDF, dill_file)

そう:

dill.dump(obj, open_file)

ファイルに直接書き込みます。一方:

dill.dumps(obj) 

objをシリアライズし、自分でファイルに書き込むことができます。

同様に:

dill.load(open_file)

ファイルから読み取り、そして:

dill.loads(serialized_obj)

ファイルから読み取ることができるシリアル化されたオブジェクトからオブジェクトを構築します。

withステートメントを使用してファイルを開くことをお勧めします。

ここに:

with open(path) as fobj:
    # do somdthing with fobj

以下と同じ効果があります。

fobj = open(path)
try:
    # do somdthing with fobj
finally:
    fobj.close()

例外の場合でも、withステートメントのインデントを終了するとすぐにファイルが閉じます。

12
Mike Müller