Ideal Reality

興味の赴くままに

[Python]Pickleでシリアライズしたオブジェクトをjsonに保存したい

なるべく保存に使用するファイル数を減らしたかったので、オブジェクトの保存が必要になった時に、Pickleで固めたオブジェクト1つにファイル1つ生成することをしたくなかった。

そこで、もともと利用していたjsonの設定ファイルに入れてしまおうと思った。

Contents
スポンサーリンク

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に復元されたオブジェクトが格納されます。

単純な話なのですが、何気に迷ったのでぜひ参考にでもしてください。

スポンサーリンク

コメント

投稿されたコメントはありません

名前

メールアドレス(任意)

コメント

関連する投稿