2

イントロ コンプ サイエンス クラスの最終日には、辞書を作成する必要がありました。私たちの本の宿題プログラムは、一連の名前と電子メール アドレスを検索、追加、変更、および削除できるものを作成するように求めています。ディクショナリをピクルするように求められますが、私にとってキッカーは、プログラムが起動するたびに、ファイルからディクショナリを取得してピクルを解除する必要があることです。自分を窮地に陥れたかどうかはわかりませんが、これまでに行ったことでこれを行う方法がわかりません。

私のコード:

import mMyUtils
import pickle
LOOK_UP = 1
ADD = 2
CHANGE = 3
DELETE = 4
QUIT = 5

def main():
    emails = {}
    choice = 0
    while choice != QUIT:
        choice = getMenuChoice()
        if choice == LOOK_UP:
            lookUp(emails)
        elif choice == ADD:
            add(emails)
        elif choice == CHANGE:
            change(emails)
        elif choice == DELETE:
            delete(emails)
        else:
            exit

def getMenuChoice():
    print()
    print('Name and Email Address Catalog')
    print('------------------------------')
    print('1. Look up an email address')
    print('2. Add a new email address')
    print('3. Change an email address')
    print('4. Delete an email address')
    print('5. Quit the program')
    print()

    choice = int(input('Enter the choice: '))
    while choice < LOOK_UP or choice > QUIT:
        choice = int(input('Enter a valid choice: '))

    return choice

def lookUp(emails):
    name = input('Enter a name: ')
    print(emails.get(name, 'Not found.'))

def add(emails):
    name = input('Enter a name: ')
    address = input('Enter an email address: ')
    if name not in emails:
        emails[name] = address
        pickle.dump(emails, open("emails.dat", "wb"))
    else:
        print('That entry already exists.')

def change(emails):
    name = input('Enter a name: ')
    if name in emails:
        address = input('Enter the new address: ')
        emails[name] = address
        pickle.dump(emails, open("emails.dat", "wb"))
    else:
        print('That name is not found.')

def delete(emails):
    name = input('Enter a name: ')
    if name in emails:
        del emails[name]
    else:
        print('That name is not found.')

main()

メール変数を何らかの形式の pickle.load に設定する必要があることはわかっていますが、一生それを理解することはできません。mMyUtils は、try/except ロジック用に作成したライブラリです。新しいものが機能するようになったら、それを入れます。

4

4 に答える 4

2

次のように辞書を保存する場合:

pickle.dump(emails, open('emails.dat', 'wb'))

以下はそれをロードします:

emails = pickle.load(open('emails.dat', 'rb'))
于 2012-12-18T12:35:40.593 に答える
1

pickle の代わりに ast.literal_eval を使用することを検討してください: http://docs.python.org/2/library/ast.html#ast.literal_eval

>>>import ast
>>> print mydict
{'bob': 1, 'danny': 3, 'alan': 2, 'carl': 40}
>>> string="{'bob': 1, 'danny': 3, 'alan': 2, 'carl': 40}"
>>> type(string)
<type 'str'>
>>> type( ast.literal_eval(string) )
<type 'dict'>

ファイルから辞書を保存/読み取るには、通常の文字列と同じように実行できます。

于 2012-12-18T16:30:39.170 に答える
1

ファイルにアクセスする前に、ファイルをロードしてデータを unpickle する必要があります。次のように変更lookUp()します。

def lookUp(emails):
    with open("emails.dat", "rb") as fo:
        emails = pickle.load(fo)

    name = input('Enter a name: ')
    print(emails.get(name, 'Not found.'))
于 2012-12-18T12:37:41.430 に答える
0

問題は、強調しきれなかったと思いますが、そもそも辞書が存在しなかった場合に私がすべきことでした。設計ドキュメントには、プログラムを実行するたびに辞書をロードする必要があると記載されています。プログラムを初めて実行する場合は、読み込む辞書がないため、エラーが発生します。基本的に、try/except を使用して関数を 2 回実行することで、これを回避しました。

私のコード:

import mMyUtils
import pickle
import dictionaryGenerator
LOOK_UP = 1
ADD = 2
CHANGE = 3
DELETE = 4
QUIT = 5

def main():
    hasError = False
    try:
        emails = pickle.load(open('emails.dat', 'rb'))
        choice = 0
        while choice != QUIT:
            choice = getMenuChoice()
            if choice == LOOK_UP:
                lookUp(emails)
            elif choice == ADD:
                 add(emails)
            elif choice == CHANGE:
                change(emails)
            elif choice == DELETE:
                delete(emails)
            else:
                print("Good-bye!")
                exit
    except Exception as err:
        hasError = True
        mMyUtils.printError("Error: no such file",err)
        mMyUtils.writeToErrorLog()

    finally:
        if hasError:
            emails = {}
        choice = 0
        while choice != QUIT:
            choice = getMenuChoice()
            if choice == LOOK_UP:
                lookUp(emails)
            elif choice == ADD:
                add(emails)
            elif choice == CHANGE:
                change(emails)
            elif choice == DELETE:
                delete(emails)
            else:
                print("Good-bye!")
                exit





def getMenuChoice():
    print()
    print('Name and Email Address Catalog')
    print('------------------------------')
    print('1. Look up an email address')
    print('2. Add a new email address')
    print('3. Change an email address')
    print('4. Delete an email address')
    print('5. Quit the program')
    print()

    choice = int(input('Enter the choice: '))
    while choice < LOOK_UP or choice > QUIT:
        choice = int(input('Enter a valid choice: '))

    return choice

def lookUp(emails):

    name = input('Enter a name: ')
    print(emails.get(name, 'Not found.'))

def add(emails):
    name = input('Enter a name: ')
    address = input('Enter an email address: ')
    if name not in emails:
        emails[name] = address
        with open("emails.dat",  "wb") as infile:
            pickle.dump(emails, infile)

    else:
        print('That entry already exists.')

def change(emails):
    name = input('Enter a name: ')
    if name in emails:
        address = input('Enter the new address: ')
        emails[name] = address
        with open("emails.dat", "wb") as infile:
            pickle.dump(emails, infile)

    else:
        print('That name is not found.')

def delete(emails):
    name = input('Enter a name: ')
    if name in emails:
        del emails[name]
    else:
        print('That name is not found.')

main()
于 2012-12-18T14:28:24.533 に答える