こんにちは、みやびのです。
今回のテーマは「Pythonistaでのデータ保存方法」です。
アプリデータを保存する方法はデータベースを活用する方法・ファイルに保存する方法などがありますが、今回はファイルにデータを保存する方法について説明します。
本記事の内容は以下の通り。
・Pythonista+UI shelveを活用したデータの保存と読み込みの方法
・Pythonista+UIデータ保存と読み込みの実装例
目次
Pythonista+UI shelveを活用したデータの保存方法
Pythonでデータをファイルに保存できるライブラリは「codecs」や「csv」などいくつか種類がありますが、今回は「shelve」というライブラリを使用します。
shelveとは?
.dataというファイル形式でデータを保存できるライブラリです。
「f['data'] = "python"」のようにキーにデータを格納することができるので、単にテキストやCSVにデータを保存するよりもデータが扱いやすいくなります。
shelveでデータを保存する方法
データを保存する手順は以下の通り。
1.データファイルを開く
2.データを格納
3.ファイルを閉じる
上記手順をまとめたコードは以下の通り。
1 2 3 4 5 | import shelve f = shelve.open('mydata') f['text'] = 'python' f.close() |
文字列や整数だけではなく配列も格納できます。
1 | f['texts'] = ['python', 'c', 'java', 'javascript'] |
2次元以上の配列も格納可能。
1 | f['texts'] = [['python', '.py'],['c', '.c'],['java', '.java'],['javascript', '.js']] |
shelveでデータを読み込む方法
データを読み込む手順は以下の通り。
1.ファイルを開く
2.ファイルを読み込む
3.ファイルを閉じる
上記をコードにすると以下のようになります。
1 2 3 4 5 | import shelve f = shelve.open('mydata') text = f['text'] f.close() |
ファイルに格納されているkeyやvalueの一覧は「list(f.keys())」、「list(f.values()」で参照できます。
1 2 3 4 | >>> list(f.keys()) ['text'] >>> list(f.values()) ['python'] |
Pythonista+UIのデータ保存と読み込みの実装例
shelveを活用してPythonista+UIにデータ保存機能を追加する場合の実装例を紹介します。
◆機能概要
・「保存ボタン」を押すとText viewに入力した内容を保存する
・「読み込みボタン」を押すと保存したデータをText viewに読み込む
Pythonista+UIの基本的な使い方については「【Pythonista】UIライブラリの基本的な使い方」をお読みください。
1データだけ保存する方法
最も簡単な方法は1データだけ保存する方法です。保存ボタンを押すたびに保存した内容を上書きします。
保存ボタンの処理は以下の通り。
「Text view」の内容を「shelf_file['text']」に格納します。
1 2 3 4 5 6 7 8 | # 保存ボタン def save_text(sender): '@type sender: ui.Button' shelf_file = shelve.open('mydata') text = sender.superview['text1'].text shelf_file['text'] = text shelf_file.close() hud_alert('保存しました') |
読み込みボタンの処理は以下の通り。
「Text view」に「shelf_file['text']」からデータを読み込みます。
1 2 3 4 5 6 7 8 9 | # 読み込みボタン def get_text(sender): '@type sender: ui.Button' shelf_file = shelve.open('mydata') if len(shelf_file) > 0: text = shelf_file['text'] sender.superview['text1'].text = text shelf_file.close() |
pyuiフィルを開いてボタンを2つ追加します。
各ボタンのパラメータは以下の通り。
◆保存ボタン
・Size:80×30
・Background Color:#ffffff
・Border:width 1.5,Radius:5
・Title:保存
・Action:save_text◆読み込みボタン
・Size:80×30
・Background Color:#ffffff
・Border:width 1.5,Radius:5
・Title:読み込み
・Action:get_text
複数のデータを保存する方法
1つのデータだけではなく複数のデータを保存したい場合もあると思います。
複数のデータを保存したい場合は配列にして格納しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 複数のテキストを保存 def save_texts(sender): '@type sender: ui.Button' shelf_file = shelve.open('mydata') text = sender.superview['text1'].text # 既にデータがある場合は読み込む if 'texts' in shelf_file: texts = shelf_file['texts'] texts.append(text) # ファイルにデータがなかった場合は直接格納 else: texts = [text] shelf_file['texts'] = texts shelf_file.close() hud_alert('保存しました') |
データを全て読み込んで「,」で連結したものをText viewに格納する処理です。
1 2 3 4 5 6 7 8 9 | # 複数のテキストを読み込む def get_texts(sender): '@type sender: ui.Button' shelf_file = shelve.open('mydata') if 'texts' in shelf_file: texts = shelf_file['texts'] sender.superview['text1'].text = ','.join(texts) shelf_file.close() |
コード全文
上記コードをまとめると以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | import ui import shelve import clipboard from console import hud_alert def add_text(sender): '@type sender: ui.Button' text1 = sender.superview['text1'].text t = sender.title sender.superview['text1'].text = text1 + t def clear_text(sender): '@type sender: ui.Button' sender.superview['text1'].text = '' def save_text(sender): '@type sender: ui.Button' shelf_file = shelve.open('mydata') text = sender.superview['text1'].text shelf_file['text'] = text shelf_file.close() hud_alert('保存しました') def get_text(sender): '@type sender: ui.Button' shelf_file = shelve.open('mydata') if len(shelf_file) > 0: text = shelf_file['text'] sender.superview['text1'].text = text shelf_file.close() def save_texts(sender): '@type sender: ui.Button' shelf_file = shelve.open('mydata') text = sender.superview['text1'].text if 'texts' in shelf_file: texts = shelf_file['texts'] texts.append(text) else: texts = [text] shelf_file['texts'] = texts shelf_file.close() hud_alert('保存しました') def get_texts(sender): '@type sender: ui.Button' shelf_file = shelve.open('mydata') if 'texts' in shelf_file: texts = shelf_file['texts'] sender.superview['text1'].text = ','.join(texts) shelf_file.close() def copy_action(sender): '@type sender: ui.Button' text = sender.superview['text1'].text clipboard.set(text) hud_alert('コピーしました') v = ui.load_view() v.present('sheet') |
終わりに
今回はPythonista+UIでデータを保存する方法を紹介しました。
shelveライブラリはパソコン版のPythonでも使えるライブラリなのでPythonista以外にも応用可能です。
アプリを作っていると保存が必要なケースが出てくると思います。
データベースに保存する方法もありますが、小さなデータであればファイルで十分です。
今回紹介した方法も参考にしつつデータ保存をやってみてください。
Pythonistaの使い方まとめ>>Pythonistaの使い方まとめ