Pythonでのpickleの使い方とは?基本的な使い方からプロトコルを指定する方法まで紹介!
- SE
- Pythonでのpickleの使い方のメリットについて、教えてください。
- PM
- まず、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.
~$
|
プロトコルを合わせれば、保存したデータを読み出せています。
- SE
- オブジェクトの状態を保存・復元するためのライブラリということですね。
- PM
- そうです。pickleでは、データの直列化・非直列化を行うことができます。
まとめ
いかがでしたでしょうか。Pythonでのpickleの使い方について説明しました。pickleを使うと、データを直列化して保存できます。また、保存したデータを読み出すことも可能です。
ぜひご自身でPythonのソースコードを書いて、理解を深めてください。
Search キーワード検索
Popular 人気の記事
-
【VB.NET入門】DataGridViewの使い方まとめ
公開: 更新:
reccomended おすすめ記事
-
【.NETが統合】.NET 5の概要と今後のリリース予定
公開: 更新:
Categories 連載一覧
Tags タグ一覧
Jobs 新着案件
-
マルチロガーソフト開発/東京都豊島区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都豊島区(池袋駅) -
マルチロガーソフト開発/東京都豊島区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都豊島区(池袋駅) -
商品化予定の振動センサーの運用保守/Python/東京都都内/【WEB面談可】
月給50万~60万円東京都都内(-駅) -
商品化予定の振動センサーの可視化UI開発のテスター/Python/東京都都内/【WEB面談可】
月給25万~35万円東京都都内(-駅) -
商品化予定の振動センサーの運用保守/Python/東京都都内/【WEB面談可】
月給50万~60万円東京都都内(-駅) -
商品化予定の振動センサーの可視化UI開発のテスター/Python/東京都都内/【WEB面談可】
月給25万~35万円東京都都内(-駅)