Pythonのリストや辞書をファイルに保存する
Pythonのリストやタプルや辞書などのオブジェクトを、CSVやJSONやXMLなどに変換することなく、そのままファイルに保存します。
目次
pickleモジュールとは
pickleというモジュールがオブジェクトの直列化(serialize)と復元(deserialize)をしてくれます。
Pythonのドキュメントではpickle化と呼んでいます。
オブジェクトをファイルに書き込む
dumpというメソッドで、バイトモードでオープンされているファイルにオブジェクトを書き込みます。
pickle.dump(obj, file, [protocol], [fix_imports])
変数 |
内容 |
---|---|
obj |
書き込むオブジェクト。 |
file |
オープン済みのファイルオブジェクト。 |
protocol |
省略可。規定値はDEFAULT_PROTOCOL。バイトデータの書式。 |
fix_imports |
省略可。規定値はTrue。Python2とのデータ互換性。 |
プロトコルの定数は下記のようになっています。(Python 3.6)
定数名 |
内容 |
---|---|
HIGHEST_PROTOCOL |
利用可能なうち、最も高いプロトコルのバージョン。(整数) |
DEFAULT_PROTOCOL |
規定のプロトコルのバージョン。Python3用の3。 |
オブジェクトをファイルから復元する
loadというメソッドで、バイトモードでオープンされているファイルからオブジェクトを復元します。
obj = pickle.load(file, [fix_imports], [encoding], [errors])
変数 |
内容 |
---|---|
obj |
復元したデータを格納するオブジェクト。 |
file |
オープン済みのファイルオブジェクト。 |
fix_imports |
省略可。規定値はTrue。Python2のデータを読み込む場合のもの。 |
encoding |
省略可。規定値はASCII。Python2のデータを読み込む場合のもの。 |
errors |
省略可。規定値はstrict。Python2のデータを読み込む場合のもの。 |
試してみた
Pythonを起動して試してみました。
$ python
Python 3.6.5 (default, Jun 12 2018, 22:29:40)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> test_object = [12.34, 'abc', 'いろは']
>>> with open('test.pickle', mode='wb') as fo:
... pickle.dump(test_object, fo)
...
>>>
そうすると、ファイルができあがっています。
$ ls -al
total 8
drwxr-xr-x 3 xxx staff 96 1 23 12:34 .
drwx------+ 14 xxx staff 448 1 23 12:34 ..
-rw-r--r-- 1 xxx staff 43 1 23 12:34 test.pickle
Pythonを起動し直して読み込んでみます。
$ python
Python 3.6.5 (default, Jun 12 2018, 22:29:40)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> with open('test.pickle', mode='rb') as fi:
... data = pickle.load(fi)
...
>>> data
[12.34, 'abc', 'いろは']
>>> test_object
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'test_object' is not defined
オブジェクトの名前は復元されないんですね。
pickle化できるもの
下記のものがpickle化できます。
None 、 True 、および False
整数、浮動小数点数、複素数
文字列、バイト列、バイト配列
pickle 化可能なオブジェクトからなるタプル、リスト、集合および辞書
モジュールのトップレベルで定義された関数 (defで定義されたもののみで、lambdaで定義されたものは含まない)
モジュールのトップレベルで定義されている組込み関数
モジュールのトップレベルで定義されているクラス
__dict__ 属性を持つクラス、あるいは __getstate__() メソッドの返り値が pickle 化可能なクラス
関数やクラスもpickle化できるようなのですが、これらは必要になったときにまた。
データ以外が含まれる場合があるので、よそでpickle化されたデータファイルを復元する場合は、セキュリティ的に要注意です。
公開日
広告