Pythonのリストや辞書をファイルに保存する

Pythonのリストやタプルや辞書などのオブジェクトを、CSVやJSONやXMLなどに変換することなく、そのままファイルに保存します。

目次

  1. pickleモジュールとは
  2. オブジェクトをファイルに書き込む
  3. オブジェクトをファイルから復元する
  4. 試してみた
  5. pickle化できるもの

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化されたデータファイルを復元する場合は、セキュリティ的に要注意です。

広告

Pythonのファイル入出力カテゴリの投稿