[Python]Pickleでシリアライズしたオブジェクトをjsonに保存したい
なるべく保存に使用するファイル数を減らしたかったので、オブジェクトの保存が必要になった時に、Pickleで固めたオブジェクト1つにファイル1つ生成することをしたくなかった。
そこで、もともと利用していたjsonの設定ファイルに入れてしまおうと思った。
jsonで利用できるデータの型
jsonでは文字列・数値・真偽値と、あとはこれらから構成する配列および辞書しか扱えません。
一方、Pickleでシリアライズしたデータはバイナリデータとなります。
なので、保存する際にはこのバイナリデータをbase64を用いて文字列に変換します。
Pickleを文字列に変換
PickleとBase64を使用するので、各自importしてください。
import pickle
import base64
Pickleでは通常、wbモード(バイナリの書き込み)で開いたファイルオブジェクトを使って
pickle.dump(オブジェクト, ファイル)
こうすることで指定したファイルにシリアライズしたオブジェクトのデータを書き込みます。
なんですが、これを
b = pickle.dumps(オブジェクト)
こうすることで、シリアライズしたバイナリデータを直接変数に格納することができます。そこで、
s = base64.b64encode(pickle.dumps(オブジェクト)).decode("utf-8")
このようにすることで、base64で文字列に変換されたPickleのデータを得られます。
jsonに保存、読み込み
jsonを用いるので、importが必要です
import json
ここでは例として、先ほど変換した文字列が変数sに格納されているとして、適当に辞書dに"pickle"というキーで格納し、file.jsonに保存します。
d = {"pickle": s}
with open("file.json", "w") as f:
json.dump(d, f)
これを読み込むには
d = {}
with open("file.json") as f:
d = json.load(f)
s = d["pickle"]
とします。
文字列からオブジェクトの復元
文字列sに格納されているとして、
o = pickle.loads(base64.b64decode(s.encode()))
とすれば、変数oに復元されたオブジェクトが格納されます。
単純な話なのですが、何気に迷ったのでぜひ参考にでもしてください。
コメント