あまり知られていない気がするPythonシリーズ第二弾!(シリーズ名は今勝手につけましたw)。
今回は超簡単にデータを永続化できる「shelve」を扱ってみます。

shelveは様々な形式のデータを永続化できます。しかも使い方は超簡単。別途パッケージインストールは不要!(Pythonに標準で組み込まれているハズ)。
コードはコチラ。
[python title="test.py"]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Hoge:
def __init__(self):
self._name = ''
self._num = 0
def set_name(self, name):
self._name = name
def get_name(self):
return self._name
def set_num(self, n):
self._num = n
def get_num(self):
return self._num
if __name__ == '__main__':
import shelve
obj_list = []
h1 = Hoge()
h2 = Hoge()
h3 = Hoge()
h1.set_name('aaa')
h1.set_num(1)
obj_list.append(h1)
h2.set_name('bbb')
h2.set_num(2)
obj_list.append(h2)
h3.set_name('ccc')
h3.set_num(3)
obj_list.append(h3)
# 保存用のファイルオープン
dic = shelve.open('./hoge_data')
# key - value でオブジェクトを突っ込む
dic['obj'] = obj_list
# 辞書を保存してみる
dic['hash'] = { 'x' : 1, 'y' : 2, 'z' : 3}
# 文字列も保存してみる
dic['string'] = 'abcdefg'
# 開いたら閉じましょう
dic.close()
[/python]
これを実行すると、バイナリ形式のデータファイルができあがります。

んで、次はこういったスクリプトを作って中身を読み込んでみます。
[python title="read.py"]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shelve
from test import Hoge
dic = shelve.open('./hoge_data')
# キー全部表示
print dic.keys()
# 取り出してみる
test_dict = dic['hash']
print test_dict
test_str = dic['string']
print test_str
obj = dic['obj']
print obj
for o in obj:
print o.get_name()
print o.get_num()
dic.close()
[/python]
実行結果
[shell light="true"]
['hash', 'obj', 'string']
{'y': 2, 'x': 1, 'z': 3}
abcdefg
[<test.Hoge instance at 0x103765ab8>, <test.Hoge instance at 0x103765b48>, <test.Hoge instance at 0x103765b90>]
aaa
1
bbb
2
ccc
3
[/shell]
ちゃんと保存した通りに取り出せますね!オブジェクトも、オブジェクトのママ取り出せているのが分かると思います。
どうです、簡単でしょう(・∀・)?
使い捨てツールや小さなバッチを作っていると「あー、データをローカルにちょーーっと保存しておきたいんだけど・・・」っていう時がたまにあります。そういった時に最適!
非常に簡単なので、是非使ってみてくださいね!!
ちなみに知られていない気がするPythonシリーズ第一弾はコチラw
割と知られていないような気がするurlparseとoptparse (Python)