メモ書きのように気軽にデータを保存しておきたい時の解決策としてshelveモジュールを解説します。
目次
shelveモジュールでデータをローカルに保存する方法
自動化プログラムを組んでいると、プログラムの外側にメモ書きのようにちょっとしたデータを残しておきたいときがあります。今回は、簡単にローカル環境にデータを保存しておき、プログラムを実行する時に読み取って実行内容に反映をさせたり、内容を上書きができるshelveモジュールについて説明します。
shelveモジュールとは何か
Python3.8.1ドキュメントの日本語版によると、標準モジュールに次の記述があります。
"シェルフ (shelf, 棚)" は辞書に似た永続性を持つオブジェクトです。 "dbm" データベースとの違いは、シェルフの値 (キーではありません!) は実質上どんな Python オブジェクトにも --- pickle モジュールが扱えるなら何でも --- できるということです。これにはほとんどのクラスインスタンス、再帰的なデータ型、沢山の共有されたサブオブジェクトを含むオブジェクトが含まれます。キーは通常の文字列です。
(ドキュメント » Python 標準ライブラリ » データの永続化 » shelve --- Python オブジェクトの永続化 より引用)
要するにカレントフォルダにファイルが生成されて、そこにデータを蓄えておくと言うことです。そのデータを蓄えておくファイルをオブジェクトとして取り扱う事ができるようになると言う事です。オブジェクトとはデータとそのデータをどう取り扱うかの命令や処理が一体になったものです。
なお、シェルフは棚です。データを棚に置いておくイメージで覚えれば良いと思います。ちなみに変数はメモのイメージです。メモは用が済んだら捨ててしまいますよね。変数はプログラムが終了したら破棄されます。棚に置いたデータ(shelveオブジェクトに格納したデータ)はプログラムが終了した後も残ります。
shelve.open()メソッドでshelveオブジェクトを取得する
shelve.open()メソッドはshelveオブジェクトを戻り値として返します。これの意味するところは、すでに引数名に相当するファイルが存在する場合はその内容をオブジェクトとして取得し、ファイルが存在しない場合は新たにカレントフォルダにファイルを生成してそのオブジェクトを返すということです。あまりよくわからないかもしれませんが、実はここでいう「カレントフォルダにファイルとして保存される」というようなことは気にする必要は無いです。パソコンのローカル環境のどこかにデータが保存されているんだな、と思っておけば問題なしです。ただ、ここで言う「ファイル」メモ帳で作成するようなテキストファイルではなく、バイナリファイルというテキストファイルではないファイルです。Pythonからオブジェクトとして操作する用のファイルなのだという事だけ頭に入れておきましょう。
辞書的に読み書きする
シンプルな例
さて、shelveモジュールの概要が分かったところで、実際にオブジェクトを生成し、利用していく方法について見ていきます。まずはシンプルなサンプルを提示します。
import shelve menubook = shelve.open('menu_data') menubook['breakfast'] = {'main':'toast', 'sub':'egg', 'drink':'milk'} menubook['lunch'] = {'main':'spam', 'sub':'ham', 'drink':'juice' } print(menubook['lunch']) menubook.close()
実行結果は下のようになります。
{'main':'toast', 'sub':'egg', 'drink':'milk'}
辞書のように、ひとつのキーに対して、文字列の組み合わせを登録することが出来ました。printで出力した結果を見れば、よく分かります。
実用的な例に改造する
ファイルを生成したり保存するような記述をしなくてもローカルに書き込むことができ、また、それを取り出すことができる事が分かりました。
ただ、これでは実用的なプログラムとは言えないので、便利なツールを目指して改造します。改造して作成するツールはパスワード管理ツールです。インターネットバンキングのサイト名とユーザーID、パスワードの組み合わせを覚えておくことが出来るツールです。
Pythonスクリプトの中で登録したいサイト名、ユーザーID、パスワードをベタ打ちするのではなく、コマンドラインから登録すべき情報を入力し、プログラムが受け取れるようにします。今回は、新規登録機能の部分をサンプルとして実装します。
#パスワード管理ツールの新規ID登録機能の部分のサンプルコード import shelve password_ichiran = shelve.open('pass_data') print('保存したいアプリ名、ログインID、パスワードを「_」で区切って入力して下さい') new_id = input() new_id_list = new_id.split('_') password_ichiran[new_id_list[0]] = {'user_id':new_id_list[1], 'password':new_id_list[2]} print(password_ichiran[new_id_list[0]] + 'を登録しました。') password_ichiran.close()
まず、shelveモジュールをインポートし、password_ichiranにshelveオブジェクトを格納します。その後、print()関数でユーザーに、正しい入力を促します。input()関数はコマンドラインに入力された内容を文字列型で返す関数です*1。アンダースコアで区切られた文字列をnew_idと言う変数に代入しています。そして、split()関数でアンダースコアを区切り文字として各文字列をnew_id_listという配列の要素に格納します。password_ichiranに辞書型のように登録しておけばOKです。最後に.close()で閉じるのを忘れないようにしましょう。
さらに、サイト名を入力するとログインIDとパスワードを出力するプログラムを作成し、データの読み込みか化書き込みか処理の分岐をさせればパスワード管理ツールとして合格点までいけると思います。また、辞書的なデータの取り扱いができるので簡易なデータベースとしても利用可能です。
Shelveモジュールでデータをローカルに保存する方法まとめ
この記事の内容をまとめます。
- ローカルに気軽にデータを保存するにはshelveモジュールを使う
- ローカルにファイルが生成されるが、ファイル名や保存場所はあまり気にしなくて良い
- 辞書的なデータとしてデータを記録できるので、簡易なデータベースとして利用できる
参考:
なお、この記事の内容は下記のサイトを参考にさせて頂きました。
shelve --- Python オブジェクトの永続化 — Python 3.8.1 ドキュメント
[Python入門]shelveモジュールによるオブジェクトの永続化:Python入門 - @IT
<関連記事>
*1:標準入力と言います