Python shelve モジュールで手軽にデータを保存する

Python でちょっとしたデータの保存に使える shelve というモジュールを試してみました。 SQLite などの DB を使うよりも手軽に、それでいてテキストファイルと違って Python のデータオブジェクトをそのまま保存できるのです。リスト型や辞書型などのデータを保存しておいて再利用が可能なのでスクリプト間でのデータの受け渡しにも使えそうですね。

データを保存するサンプルです。リストと現在時刻をそれぞれ myshelve という shelve に保存します。

import datetime
import shelve


def save_data(some_data):
    d = shelve.open('./myshelve')
    d['obj'] = some_data
    # 現在の日時
    today = datetime.datetime.now()
    updated = today.strftime('%Y/%m/%d %a %H:%M:%S')
    d['updated'] = updated
    d.close()
    print('data saved!')


def main():
    list = ['Hokusai', 'Utamaro', 'Taro']
    list.append('Hiroshige')
    save_data(list)


if __name__ == '__main__':
    main()

モジュールを import して、ファイルを開くときと同じように shelve.open(filename) という形で開いて、辞書型のようにキーを指定してデータを代入します。

import shelve


def main():
    mydata = shelve.open('./myshelve')
    print('type:', type(mydata))
    print('keys_type:', type(mydata.keys()))
    print('keys:', list(mydata.keys()))
    print('items:', list(mydata.items()))
    print('obj:', mydata['obj'])
    print('updated:', mydata['updated'])


if __name__ == '__main__':
    main()

読み込むときも辞書型と同じような感じで OK でした。 上記コードの結果は以下のようになります。

type: <class 'shelve.DbfilenameShelf'>
keys_type: <class 'collections.abc.KeysView'>
keys: ['obj', 'updated']
items: [('obj', ['Hokusai', 'Utamaro', 'Taro']), ('updated', '2014/04/24 Thu 15:13:31')]
obj: ['Hokusai', 'Utamaro', 'Taro']
updated: 2014/04/24 Thu 15:13:31