「Pythonの学習とどのような関係があるの?」
「pickleの使い方について具体的に知りたい!」
このように、Python学習を進めていくと「pickle」という単語を目にする機会も多くなるのではないでしょうか。
pickleを活用することでPythonの開発効率を上げることができるのですが、具体的にどのようなことができるのか、まだ疑問に感じる方も多いと思います。
そこで今回の記事は「pickle」について、使い方や実際のコードもご紹介していこうかと思います!
目次
Pythonの「pickle」とは何のこと?
まずは「pickle」についての理解を深めていきましょう。
pickleは数多くあるPythonライブラリのうちの一つで、オブジェクトの直列化や非直列化を通じてオブジェクトを保存し復元することができるライブラリです。複数のオブジェクトを一つのまとまりに保存することができ、また保存したオブジェクトの読み込みが可能なライブラリとなっています。
名前の由来ですが、直訳すると「pickle」=「漬物」となります。漬物のように元の状態を保存し再度取り出すことから、「pickle」という名前が付けられています。
pickleの変換には「バイナリーデータ」と「テキストデータ」の2パターンがあり、Pythonオブジェクトをバイナリデータなどに変換したり保存することにより、別の場所やタイミングでそのオブジェクトを復元させることがpickleの使い道となります。
pickleで使用するオブジェクトは、変数や配列などが一般的です。まず覚えておきたいことがあり「直列化」と「非直列化」、そして「バイト型」についてご紹介します。
直列化(serialize)
「直列化」とは、オブジェクトをバイト列などに変換してえ状態を維持することを指します。それをファイルとして保存することによって、呼び出しが行えるようになるのです。
非直列化(deserialize)
「非直列化」は直列化の逆のことで、バイト配列などに変換されたオブジェクトを元の形式に復元することになります。
バイト型
「バイト配列」はバイト型のデータを列として並べたものを指します。
「バイト型」は、数値型や文字列型、また画像データの元となる最小のデータ型のことで、様々なデータ型を共通の形式で保存することができるデータ型となります。
バイト型はファイル形式などを気にすることなく使用できるため、Pythonで「pickle」を扱う際にはバイト型のデータを使用するのがおすすめです。
pickleを使って保存を行う方法について
では早速、pickleでPythonオブジェクトをファイルとして保存する方法についてご紹介します。この保存の作業のことを「直列化」といいます。
- wモードでの保存
- wbモードでの保存
保存方法には上記の2通りあり、使用するソースコードが僅かに違います。それぞれの記述方法や特徴について、理解していきましょう。
ファイルを保存するためには、まず「open関数」を使用して保存するファイルを開きます。その時に保存するモードがあり、「テキストモード」と「バイナリーモード」どちらを使用するかによって保存形式が変化します。
wモードでの保存
1 2 3 4 5 6 |
import pickle webkatsu = ['a','b','c'] f = open('sample.textfile','w') pickle.dump(sample_list,f) f.close |
「wモード(テキストモード)」でファイルの保存をする場合は、上記の通りに記述します。
まずはimport文 で標準のライブラリであるpickleをimportし、Python環境でpickleを使用できる状態にします。
次の手順として、保存するためのPythonオブジェクトを用意します。このソースコードでは、a、b、c 3つのアルファベットのリストを用意します。
そしてここまでの手順が終わったら、保存用のファイルを書き込みモードで開き、変数 f にファイルオブジェクトを取得する流れとなります。
wbモードでの保存
1 2 3 4 5 6 |
import pickle webukatsu = ['a','b','c'] f = open(‘sample.binaryfile’,’wb’) pickle.dump(sample_list,f) f.close |
「wbモード(バイナリーモード)」でファイルの保存をする場合は、上記の通りに記述します。
テキストモードでの記述方法の違いとしては、「open関数」を使用する時の引数のみです。wモードは “w” を、wbモードでは “wb” と指定します。
これでバイナリーモードでのpickle化が完了するのですが、なぜ2つのモードがあるのでしょうか。それは、Pythonのバージョンに関係しているのです。
pickleでのテキストモードの保存は、Python2.7の場合簡単に行うことが可能です。しかしPython3.x系ではバイト型データの扱いを基本としているため、テキストモードでの保存手順ではエラーになるのです。
つまり別環境でpickleファイルを復元する可能性がある場合、特にテキストモードにする必要がなければ、バイナリモードで使用することが推奨されます。
pickleを使って読み込みを行う方法について
続いては直列化したpickleファイルを読み込む方法についてご紹介していきます。この読み込み作業を「非直列化」といって、テキストデータやバイナリデータとして保存したファイルを、元のPythonオブジェクトに戻す作業となります。
- rモード
- rbモード
方法には上記の2通りあり、こちらも使用するソースコードが僅かに違います。それぞれの記述方法や特徴について、理解していきましょう。
rモードでの読み込み
1 2 3 4 |
import pickle f = open('webukatsu.textfile','r') pickle.load(f) |
「rモード(テキストモード)」でファイルの読み込みをする場合は、上記の通りに記述します。この方法では、pickleが importされていない場合を考慮して、再度pickleをimportするのです。
そして保存されたpickleファイルを読み込みモードで開き、ファイルオブジェクトを取得する流れとなります。取得したファイルオブジェクトを引数としてpickle.loadメソッドを使い、読み込んだファイルを非直列化することによって、Pythonオブジェクトを復元することが可能となります。
rbモードでの読み込み
1 2 3 4 5 |
import pickle f = open(‘webukatsu.binaryfile’,’rb’) pickle.load(f) |
「rbモード(バイナリーモード)」でファイルの読み込みをする場合は、上記の通りに記述します。こちらもファイルの保存時と同様に、変更点はopen関数の第二引数を “r” から “rb” にすることです。
ここで一つ注意点として、バイナリモードで保存したpickleファイルはバイナリモードで復元する必要があるため、覚えておきましょう。つまり「テキストモード」で保存したファイルを「バイナリーモード」で復元はできないのです。
まとめ
いかがでしたか?
今回の記事では Pythonの「pickle」について、その使い方や保存・読み込み時の記述方法についてご紹介してみました。Pythonは機械学習の開発を始め、様々な開発に活用できるプログラミング言語なので、ぜひ習得を目指しましょう!