Saki0506
@Saki0506 (さき おぐら)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PythonのshelveモジュールのバイナリファイルにInputで入力した値を保存したい

Q&A

Closed

解決したいこと

Shelveモジュールについて質問が二つあります。
サンプルコードは下にあります。

1.Pythonのshelveモジュールに保存された辞書型から値を取り出したい場合はどのように書いたら取り出せますでしょうか?
2.Pythonのshelveモジュールで作成されたバイナリファイルにユーザーにinput()メゾットで入力させた値を保存して更新したいです。
例えば下記のコードで言うと辞書型のデータが保存してある変数「menubook['breakfast'] 」に"desert":"pudding"のようなデータをユーザーがinputで入れてそれを保存するにはどのようにしたら良いでしょうか?open()やwrite()メゾットの基本的な使い方は学んでおりそれを使えばできるのはわかっているのですが自分で実際にコードに書くことができませんでした。

該当するソースコード

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()

自分で試したこと

関連書籍やWEBサイトなどで調べましたが見つけることができませんでした。

よろしくお願いします。

0

2Answer

プログラムを終了すると値が元に戻ってしました。

「該当するソースコード」にinputによるユーザ入力を追加しているとすると、冒頭でmenubookの内容が初期化されてしまいますね。以下のような感じでいかがでしょう。

create_menu_data.py
# メニューを生成する(初期化する)

import shelve

menubook = shelve.open('menu_data')

menubook['breakfast'] = {'main': 'toast', 'sub': 'egg', 'drink':' milk'}
menubook['lunch'] = {'main': 'spam', 'sub': 'ham', 'drink': 'juice'}

menubook.close()
display_menu_data.py
# メニューの内容を表示する

import shelve

menubook = shelve.open('menu_data')

for item in menubook.items():
    print(item)

menubook.close()
add_menu_data.py
# メニューに項目を追加する

import shelve

menubook = shelve.open('menu_data', writeback=True)

key = input("Enter key: ")
value = input("Enter value: ")
menubook['breakfast'][key] = value

menubook.close()
$ python create_menu_data.py  # メニューを生成(初期化)する

$ python display_menu_data.py  # メニューを表示してみる
('lunch', {'main': 'spam', 'sub': 'ham', 'drink': 'juice'})
('breakfast', {'main': 'toast', 'sub': 'egg', 'drink': ' milk'})

$ python add_menu_data.py  # メニューにデザートを追加する
Enter key: desert
Enter value: pudding

$ python display_menu_data.py  # メニューを再確認する
('lunch', {'main': 'spam', 'sub': 'ham', 'drink': 'juice'})
('breakfast', {'main': 'toast', 'sub': 'egg', 'drink': ' milk', 'desert': 'pudding'})
1Like

Comments

  1. @Saki0506

    Questioner

    ありがとうございました!

1.Pythonのshelveモジュールに保存された辞書型から値を取り出したい場合はどのように書いたら取り出せますでしょうか?

menubook['lunch']menubook['breakfast'] が辞書なので、例えば以下のようにして値を取り出すことができます。

print(menubook['lunch']['drink'])  # juice

2.Pythonのshelveモジュールで作成されたバイナリファイルにユーザーにinput()メゾットで入力させた値を保存して更新したいです。

shelveの読み込みや後処理は省略しますが、inputによるユーザ入力の取得と格納は以下のようになるでしょう。

key = input("Enter key: ")
value = input("Enter value: ")

menubook['breakfast'][key] = value
0Like

Comments

  1. @Saki0506

    Questioner

    回答ありがとうございます。
    教えていただいたコードで問題なく追加できたのですが、プログラムを終了すると値が元に戻ってしました。

    '''
    shelve.open('menu_data', writeback=True)
    '''

    このようにwriteback=Trueも使ってみましたがうまく保存できませんでした。どのようにしたら保存できるか教えていただけないでしょうか?

Your answer might help someone💌