Pythonでのpickleの使い方とは?基本的な使い方からプロトコルを指定する方法まで紹介!
- システム
エンジニア - Pythonでのpickleの使い方のメリットについて、教えてください。
- プロジェクト
マネージャー - まず、pickleの使い方について説明していきましょう。
Pythonでのpickleの使い方とは?
今回は、Pythonでのpickleの使い方について説明します。pickleを使うと、データを直列化して保存できます。また保存したデータを読み出すこともできます。
Pythonでのpickleの使い方に興味のある方はぜひご覧ください。
基本的な使い方
Pythonでのpickleの基本的な使い方を紹介します。
実際のソースコードを見てみましょう。
1
2
3
4
5
|
# save.py
import pickle
with open('sample.pickle', mode='wb') as f:
pickle.dump('pickle sample code.', f)
|
1
2
3
4
5
6
|
# load.py
import pickle
with open('sample.pickle', mode='rb') as f:
s = pickle.load(f)
print(s) # pickle sample code.
|
実行結果は以下のようになります。
1
2
3
4
|
~$ python save.py
~$ python load.py
pickle sample code.
~$
|
sample.pickleというファイルを介して、オブジェクトにアクセスできていることが分かります。このようにPythonでは、pickleでオブジェクトを直列化できます。
複数オブジェクト
Pythonでのpickleで、複数オブジェクトを直列化する方法を紹介します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
|
# save.py
import pickle
mystr = 'pickle sample code.'
mylist = [1, 2, 3, 4, 5]
mydict = {1:"red", 2:"green", 3:"blue"}
with open('sample.pickle', mode='wb') as f:
pickle.dump(mystr, f)
pickle.dump(mylist, f)
pickle.dump(mydict, f)
|
1
2
3
4
5
6
7
8
9
10
|
# load.py
import pickle
with open('sample.pickle', mode='rb') as f:
mystr = pickle.load(f)
mylist = pickle.load(f)
mydict = pickle.load(f)
print(mystr) # pickle sample code.
print(mylist) # [1, 2, 3, 4, 5]
print(mydict) # {1: 'red', 2: 'green', 3: 'blue'}
|
実行結果は以下のようになります。
1
2
3
4
5
6
|
~$ python save.py
~$ python load.py
pickle sample code.
[1, 2, 3, 4, 5]
{1: 'red', 2: 'green', 3: 'blue'}
~$
|
クラスインスタンス
Pythonでクラスインスタンスを直列化する方法を紹介します。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# human.py
class Human:
# インスタンス変数
name = None # 名前
age = None # 年齢
# コンストラクタ
def __init__(self, name, age):
self.name = name
self.age = age
# クラスメソッド
def printinfo(self):
print('name:{0}, age:{1}' . format(self.name, self.age))
|
1
2
3
4
5
6
7
8
9
|
# save.py
import pickle
from human import Human
# インスタンス生成
human = Human('taro', 20)
with open('sample.pickle', mode='wb') as f:
pickle.dump(human, f)
|
1
2
3
4
5
6
|
# load.py
import pickle
with open('sample.pickle', mode='rb') as f:
human = pickle.load(f)
human.printinfo()
|
実行結果は以下のようになります。
1
2
3
4
|
~$ python save.py
~$ python load.py
name:taro, age:20
~$
|
このようにPythonでは、クラスインスタンスを直列化できます。
ファイルを介さない
Pythonでファイルを介さない直列化について紹介します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
|
import pickle
import io
file = io.BytesIO()
pickle.dump('pickle sample code.', file)
file.seek(0)
s = pickle.load(file)
print(s)
|
実行結果は以下のようになります。
1
|
pickle sample code.
|
ファイルを介さずにオブジェクトの読み書きができていることが分かります。
プロトコル指定
Pythonの直列化において、プロトコルを指定する方法を紹介します。
実際のソースコードを見てみましょう。
1
2
3
4
5
|
# save.py
import pickle
with open('sample.pickle', mode='wb') as f:
pickle.dump('pickle sample code.', f)
|
1
2
3
4
5
6
|
# load.py
import pickle
with open('sample.pickle', mode='rb') as f:
s = pickle.load(f)
print(s) # pickle sample code.
|
例えば、python3でpickleで保存して、python2で読みだす場合、実行結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
~$ python save.py
~$ python2 load.py
Traceback (most recent call last):
File "load.py", line 5, in <module>
s = pickle.load(f)
File "/usr/lib/python2.7/pickle.py", line 1384, in load
return Unpickler(file).load()
File "/usr/lib/python2.7/pickle.py", line 864, in load
dispatch[key](self)
File "/usr/lib/python2.7/pickle.py", line 892, in load_proto
raise ValueError, "unsupported pickle protocol: %d" % proto
ValueError: unsupported pickle protocol: 3
~$
|
プロトコル不一致のため、実行時エラーになります。
ここでのバージョン情報は以下です。
1
2
3
4
5
|
~$ python -V
Python 3.6.9
~$ python2 -V
Python 2.7.17
~$
|
このエラーを発生させずに読み込むには、保存時にプロトコルを指定します。
1
2
3
4
5
6
|
# save.py
import pickle
with open('sample.pickle', mode='wb') as f:
# protocol=2を指定
pickle.dump('pickle sample code.', f, protocol=2)
|
実行結果は以下のようになります。
1
2
3
4
|
~$ python save.py
~$ python2 load.py
pickle sample code.
~$
|
プロトコルを合わせれば、保存したデータを読み出せています。
- システム
エンジニア - オブジェクトの状態を保存・復元するためのライブラリということですね。
- プロジェクト
マネージャー - そうです。pickleでは、データの直列化・非直列化を行うことができます。
まとめ
いかがでしたでしょうか。Pythonでのpickleの使い方について説明しました。pickleを使うと、データを直列化して保存できます。また、保存したデータを読み出すことも可能です。
ぜひご自身でPythonのソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)