Python pickle

Python学習【365日チャレンジ!】146日目のマスターU(@Udemy11)です。

気分転換で、前からやろうと思っていたアジング用ワームの整理をしました。

アジングをしていると、「これは釣れる!」なんてYoutubeを見てしまって、つい紹介されているワームを購入したり、釣れるワームと同じ形状のワームが格安で売っていた場合は、思わず衝動買してしまいます。

とはいえ、実際に釣れたときのワームをよく使うようになるので、あまり使わないワームが増えていくんです。

今回思い切って使わないワームなどを断舎離したところ、何種類かのワームだけがのこり、スッキリしたのですが、ちょっと寂しくなってしまいました。

まーこれからも新しいワームが増えるような気はしますが。。。

それでは今日もPython学習を始めましょう。

昨日の復習

昨日はMemcachedを学習しました。

memcachedは、データベースへの問い合わせが混雑するのを回避するために、caccheにリクエストを一時保存して、データのやり取りの交通整理をしてくれるものでした。

詳しくは昨日の記事をごらんください。

今日は、ピクルスと間違えそうな?!pickleについて学習しましょう!

pickleとは

ちなみにピクルスは、pickleの複数形です。

Python pickle

ピクルスはいわゆる漬物で、自然発酵させた保存食ですが、あとから食べられる(保存して使える)というところから、pickleという名前になっているようです。

それならデータベースはすべてpickleじゃないの?

なんて突っ込みたくなっちゃいますが、そこは気にせずスルーしてください。

ただ、漬物のように、味が変わったり、形状が変わったりはしませんけど。。。

また、pickleはPythonだけで扱えるフォーマットなので、他のデータベースで活用することはできません。なので拡張性を求めるのであれば、あまりおすすめできない方法です。

pickleを使う

pickleは標準ライブラリのひとつなので、インポートすれば利用することができます。

ということで、実際のpickleのコードを書いていきましょう。

import pickle


class Test(object):
    def __init__(name):
        self.name = name

data = {
    'a': [1, 2, 3]
    'b': ('test1', 'test2'),
    'c': {'key1', 'value1'},
    'd': Test('test_name')
}

with open('test.pickle', 'wb') as f:
    pickle.dump(data, f)

with open('test.pickle', 'rb') as f:
    data_loaded = pickle.load(f)
    print(data_loaded)

出力結果

{'a': [1, 2, 3], 'b': ('test1', 'test2'), 'c': {'key1', 'value1'}, 'd': <__main__.Test object at 0x1062c8d30>}

4行目から6行目は、初期化でnameだけ取得するクラスを作成しています。

8行目から13行目で、辞書型変数datavalueに、リスト、タプル、集合、先に定義したクラスオブジェクトを入れています。

15行目、16行目でwithステートメントを使ってtest.pickleを作成し、辞書型変数dataを書き込んでいます。

wbは、バイナリーモードでの書き込みという意味で、バイナリーは人間は読めないけどコンピューターが読めるデータのことです。

18行目から20行目で、作成されたtest.picklerb(バイナリーで読み込みモード)で読み込み、data_loadedに読み込んだデータを代入して出力しています。

作成されたtest.pickleをPycharmで開いてみると、バイナリーデータなので、よくわからない文字が並んでいるのがわかります。

Python pickle

タイプを確認

上記のコードのうち、20行目以降を次のコードに変更して、タイプとdのバリュー、つまりTestインスタンスの名前を取得します。

    print(type(data_loaded['a']))
    print(type(data_loaded['b']))
    print(type(data_loaded['c']))
    print(type(data_loaded['d']))
    print(data_loaded['d'].name)

出力結果

<class 'list'>
<class 'tuple'>
<class 'set'>
<class '__main__.Test'>
test_name

タイプはそれぞれリスト、タプル、集合、Testクラスが返されます。

最後にTestインスタンスの引数であるnameが返されています。

使えるのはPython内だけ

他のデータベースの場合は、C言語やJavaなどの他の言語で読み込むことが可能ですが、pickleの場合はPythonでしか書き込んだり読み込んだりできません。

なので、Pythonしか使わないという状況では活用されるかもしれませんが、あまり使われていないかもしれません。

とりあえず、こんな使い方ができるデータベースのようなものがあるということをおぼえておくといいでしょう。

これまでデータベースを学習してきて、基本的にデータベースは非常にシンプルで、データを保存することと取り出すことで、どう料理するかはプログラマー次第ということがわかってきました。

最近プログラミング学習が注目を浴びていますが、最初の導入は、完成形がある部品を組み立ててつくるプラモデルに近いものがあります。

そこからいろいろなパーツを自分で選んで自分だけの完成品を作るレゴブロックにステップアップするのと同じく、いろいろなモジュールを活用して、自由にプログラムを組み立てることができるようになれば、もう立派なプログラマーです。

今はまだ部品を揃えているところですが、これからどう組み合わせて必要性の高いものを作れるのかが腕の見せどころではないでしょうか。

とはいえ、そろそろ中だるみが襲ってきそうなので、しっかりと気を引き締めて学習をすすめていこうと思います。

それでは明日もGood Python!