tl;dr
python -m picke hoge.pklでpickleの中身を直に見ることができることを初めて知った。これまで.pklにしたいけどlessできないしなと悩んでたのが馬鹿みたいだ…… https://t.co/QUXqS8WyLh
— やぐ (@yag_ays) February 9, 2017
課題
Pythonで様々なオブジェクトをpickleという形式でシリアライズすることができます。一方で、jsonファイルやテキストファイルと違いバイナリファイルとなるため、catやlessで容易に確認することができず、いちいちpythonのインタプリタでwith句を書いて中身を取り出す必要があると思っていました。
# 書き込み
with open("hoge.pkl", mode="wb") as f:
pickle.dump({"hoge":"fuga"}, f)
# 読み込み
with open("hoge.pkl", mode="rb") as f:
hoge = pickle.load(f)
ちなみに、上記のhoge.pklをcatで表示すると以下のようになります。
$ cat hoge.pkl
?}qXhogeqXfugaqs.%
解決法:シェルから直にpickleの中身を確認する
しかし、pythonのコマンドで直にpickleの中身を確認することができる方法がありました。それがpython -m pickle
というコマンドです。-m
というオプションはPythonの標準モジュールを実行してくれるため、pickleを指定するとその読み込み結果を表示してくれます。python -m SimpleHTTPServer
やpython -m http.server
でWebサーバが立ち上がるのと同じ仕組みですね。
上のpythonコードで作成したhoge.pklというファイルがあった場合に、以下のようにして中身を表示させることができます。
$ python -m pickle hoge.pkl
{'hoge': 'fuga'}
また、オブジェクトの場合は以下のように表示されます。
$ python -m pickle dictionary.pkl
<gensim.corpora.dictionary.Dictionary object at 0x104e7ac51>
シェルのエイリアスに登録する
これだけでも個人的には大発見でpickleを積極的に利用できる理由になるほど便利なのですが、いちいちpython -m pickle
とタイプするのは大変なので、シェルの機能でaliasを設定してみます。
bash/zshの場合、以下のようになります。pickleはPythonのバージョンで非互換なので、python2/python3を明示的に指定したい場合は、絶対パスでpythonを指定しておいた方が良いでしょう。
alias pcat='python -m pickle'
こうすることによって、$ pcat hoge.pkl
というコマンドで簡単にpickleファイルの中身を確認することができます。